Development
글수 82
얼마전 프로퍼티에 대해 궁금한 점들 몇개가 생겨서 질문란에 올렸습니다.(http://www.iphoneos.co.kr/zbxe/35169)
이와 관련된 꼬리에 꼬리를 무는 궁금증 중 하나가 해결되어서 이곳에 글을 올립니다.
저는 이미지를 로딩하고 해제하는데 다음과 같은 루틴을 사용합니다.
@property (nonatomic, retain) UIImage* grass;
@synthesize grass;
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
grass = [[UIImage imageNamed:@"grass.png"] retain];
}
return self;
}
- (void)dealloc {
[grass release]; grass = nil;
[super dealloc];
}
여기서 dealloc의 grass는 프로퍼티로 접근될까요? 직접 접근될까요?
( 자꾸 나오는 물음표군에 화내지 마세요~# 잇힝)
답은, 직접 접근입니다.
왜나면 프로퍼티에 대한 접근은 self.grass로 가능하기 때문에 self.없는 grass는 변수에 대한 직접 접근에 할당된거죠.
위의 코드는 retain에서 grass가 가리키는 데이터의 reference counter를 1올리고 release에서 reference counter를 1내리기에 올바른 코드입니다.
그런데
- (void)dealloc {
[self.grass release]; self.grass = nil;
[super dealloc];
}
이따위로 코드를 짜면 어떻게 될까요?
(물음표군 또 등장.)
release에서 reference counter를 1내리고,
@property (nonatomic, retain) <= 요기서 retain으로 정의된 프로퍼티에 의해 self.grass = nil 에서 또다시 reference counter를 1을 내리기 때문에 잘못된 코드입니다. ( 근데 컴파일은 물론 프로그램 실행 종료까지 워닝한번 안뜸니다.)
이상 프로그래밍과 상관있는듯 보이지만 상관없는 이야기였습니다.
이와 관련된 꼬리에 꼬리를 무는 궁금증 중 하나가 해결되어서 이곳에 글을 올립니다.
저는 이미지를 로딩하고 해제하는데 다음과 같은 루틴을 사용합니다.
@property (nonatomic, retain) UIImage* grass;
@synthesize grass;
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
grass = [[UIImage imageNamed:@"grass.png"] retain];
}
return self;
}
- (void)dealloc {
[grass release]; grass = nil;
[super dealloc];
}
여기서 dealloc의 grass는 프로퍼티로 접근될까요? 직접 접근될까요?
( 자꾸 나오는 물음표군에 화내지 마세요~# 잇힝)
답은, 직접 접근입니다.
왜나면 프로퍼티에 대한 접근은 self.grass로 가능하기 때문에 self.없는 grass는 변수에 대한 직접 접근에 할당된거죠.
위의 코드는 retain에서 grass가 가리키는 데이터의 reference counter를 1올리고 release에서 reference counter를 1내리기에 올바른 코드입니다.
그런데
- (void)dealloc {
[self.grass release]; self.grass = nil;
[super dealloc];
}
이따위로 코드를 짜면 어떻게 될까요?
(물음표군 또 등장.)
release에서 reference counter를 1내리고,
@property (nonatomic, retain) <= 요기서 retain으로 정의된 프로퍼티에 의해 self.grass = nil 에서 또다시 reference counter를 1을 내리기 때문에 잘못된 코드입니다. ( 근데 컴파일은 물론 프로그램 실행 종료까지 워닝한번 안뜸니다.)
이상 프로그래밍과 상관있는듯 보이지만 상관없는 이야기였습니다.

- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
self.grass = [UIImage imageNamed:@"grass.png"]; // 명시적인 retain 생략
}
return self;
}
- (void)dealloc {
[grass release];
[super dealloc];
}