얼마전 프로퍼티에 대해 궁금한 점들 몇개가 생겨서 질문란에 올렸습니다.(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을 내리기 때문에 잘못된 코드입니다. ( 근데 컴파일은 물론 프로그램 실행 종료까지 워닝한번 안뜸니다.)


이상 프로그래밍과 상관있는듯 보이지만 상관없는 이야기였습니다.
이 게시물을..