2010-04-11 2 views
0

나는 Objective-C 방식을 다시했을 때, 최근에 (즉 지금은) retainrelease과 관련하여 Apple 사이트에서 설명서를 읽었습니다.Apple의 참조 라이브러리에서 유지/해제 의미에 대한 기본적인 질문

- (void)setUpPlacardView 
{ 
    // Create the placard view -- it calculates its own frame based on its image. 
    PlacardView *aPlacardView = [[PlacardView alloc] init]; 
    self.placardView = aPlacardView; 
    [aPlacardView release]; // What effect does this have on self.placardView?! 
    placardView.center = self.center; 
    [self addSubview:placardView]; 
} 

전체 클래스를보고하지, self.placardView 또한 PlacardView *aPlacardView에 그것의 할당하지 않습니다 것 같다 그러나, 조금 혼란 저를 가지고 자신의 Creating an iPhone Application 페이지 코드의 비트가있다 그것에 대한 참조를 유지할 것임을 나타내는 것처럼 보입니다. 그래서, 제가 언급 한 라인 ([aPlacardView release];)은 보유 수 0을 가지고 할당 해제되는 aPlacardView이 될 수 있습니다. self.placardView이 가리키고 있기 때문에 현재 할당 해제 된 메모리를 가리키며 문제가 발생하지 않습니까?

답변

3

안녕하세요,의 Obj-C가 속성 그동안의 (악) 개념을 도입 할 때, 내가 목표 - C의 방법으로 다시 했어요.

self.placardView=xxx; 

self->placardView=xxx; 

이 다릅니다. 전자는 정의상, [self setPlacardView:xxx]을 호출하지만, 후자는 단지 xxx을 멤버로 할당합니다. 당신이 MoveMeView.h 볼 때 지금, 당신은

@property (nonatomic, retain) PlacardView *placardView; 

MoveMeView.m

@synthesize placardView; 

이들의

은 표준/해제의 의미를 유지하여, 적절하게 -setPlacardView:placardView를 생성하는 컴파일러에게 라인을 참조하십시오. 자세한 내용은 Apple 설명서 properties을 참조하십시오.

+0

속성의 개념은 악의가 아니며, Apple이 도입 한 점 표기법입니다 시각. 그것은 구문을 오염시키고 끝없는 혼란을 야기합니다. 개인적으로 나는 많은 속성을 사용하지만, 일반적인 Objective-C 구문을 사용하여 설정하고 가져온다. – JeremyP

+0

예 동의합니다. 그래서 나는 시작하기 위해 악마라는 단어를 괄호 안에 넣었습니다. 나를 위해 점 표기법은 완벽하게 OK입니다. 나는 항상 이것들이 메소드 호출임을 상기시킨다. 그러나 나는 그것이 초심자에게 혼란의 큰 원천이라는 것에 진심으로 동의한다. – Yuji

1

몇 가지 지적 할 점;

속성 placardView가 유지되는 것으로 정의 된 경우 (@property (retain) ...) self.placardView는 컴파일러에서 생성 된 setter를 retain을 포함하여 호출합니다.

그냥 새로 입니 다. 속성과 관련된 @synthesize는 - (void)setPlacardView:(UIView *)view- (UIView *)placardView 메쏘드를 생성하도록 컴파일러에 지시합니다.

주목할 또 다른 사항; addSubview : 주어진보기를 유지합니다. 따라서 릴리스가 없으면보기의 보유 수는 2가됩니다. 하위보기로 추가하고 추가하면 보유 수는 1이됩니다.

관련 문제