2010-05-04 8 views
3

내가 읽은 거의 모든 책에서 나는 포인터를 통해 이런 식으로 초기화되는 것을 보았습니다. 내가 초기화하려는 클래스 변수 NSString * myString이 있다고 가정 해보십시오. 나는 거의 항상 다음과 같은 방법으로 이것을 보게 될 것입니다.왜 이런 식으로 포인터를 초기화합니까?

-(id)init { 
    if (self = [super init]) { 
     NSString *tempString = [[NSString alloc] init]; 
     self.myString = tempString; 
     [tempString release]; 
    } 
    return self; 
} 

왜 나는 다음을 할 수 없습니까? 여분의 tempString 이제까지 처음부터 필요한 이유

-(id)init { 
    if (self = [super init]) { 
     self.myString = [[NSString alloc] init]; 
    } 
    return self; 
} 

나는 표시되지 않습니다,하지만 난 메모리 관리와 함께 여기에 뭔가를 누락 될 수 있습니다. 나는 받아 들일만한 일을하고 싶은가 또는 어떤 종류의 유출을 일으킬 것인가? developer.apple.com에서 Memory Management Guide를 읽었으며 뭔가를 놓치지 않으면 차이점을 알 수 없습니다.

답변

5

는 제 2 예

-(id)init { 
    if (self = [super init]) { 
     self.myString = [[[NSString alloc] init] autorelease]; 
    } 
    return self; 
} 

을이어야하거나 누설한다. 나는 이것이 사실이라고 가정 할 수 있으며 첫 번째 예제는 단순히 autorelease을 사용하지 않으려 고합니다.

+0

자동 회수 기능이 없으면 마지막에 보유 개수가 2입니까? – Rob

+0

넵, alloc의 경우 '+ 1'이고 보유 된 속성의 경우 '+ 1'입니다. –

+0

완벽한! 덕분에 완전한 감각을 갖습니다 ... – Rob

4

두 번째 예는 정확합니다.

myString이 ivar라고 가정하면 첫 번째 예제는 매달린 포인터 (할당 해제 된 개체에 대한 포인터)가 myString으로 남겨지기 때문에 실제로 잘못되었습니다. 다른 이야기가 될 self.myString 인 경우. self.myString가 유지 속성이면

+0

Doh ... 당신이 맞습니다, 내가 원래를 수정하자. 그래서 두 사람 사이에는 아무런 차이가 없습니다. – Rob

+0

@Rob : 이제 두 번째 코드에 메모리 누수가 있습니다. – kennytm

관련 문제