2010-03-23 4 views
1

저는 C++ 세계에서 온 초보 ObjectiveC 프로그래머입니다.홀더가 유지되는 동안 보유 된 속성의 동작

@interface User : NSObject 
{ 
    NSString* name; 
} 

@property (nonatomic,retain) NSString* name; 

- (id) initWithName: (NSString*) theName; 
- (void) release; 

@end 

@implementation User 

@synthesize name 

- (id) initWithName: (NSString*) theName 
{ 
    if (self = [super init]) 
    { 
     [self setName:theName]; 
    } 
    return self; 
} 

- (void) release 
{ 
    [name release]; 
    [super release]; 
} 

@end 

다음 코드를 고려 아니, 난이 유지 카운트 결과를 이해할 수 없다 :

/나는 다음과 같은 클래스가 말 : 나는 그것이 매우 어려운 NSObject를 제공하는 메모리 관리를 이해하기 위해 찾아

NSString* name = [[NSString alloc] initWithCString:/*C string from sqlite3*/]; 
// (1) name retainCount = 1 
User* user = [[User alloc] initWithName:name]; 
// (2) name retainCount = 2 
[whateverMutableArray addObject:user]; 
// (3) name retainCount = 2 
[user release]; 
// (4) name retainCount = 1 
[name release]; 
// (5) name retainCount = 0 

(4)에서 이름의 보유 수는 2에서 1로 감소했습니다. 그러나 올바르지 않습니다. 여전히 이름을 가리키는 배열 안에 사용자 인스턴스가 있습니다! 변수의 보유 수는 참조 변수의 보유 수가 0 일 때, 즉 할당 해제되고 해제되지 않은 경우에만 감소해야합니다.

답변

4

release을 재정의하지 말아야하며 dealloc 만 재정의해야합니다. user에 대한 보유 수를 0으로 설정하면 dealloc이 호출되어 name이 해제됩니다.

release의 이름을 dealloc으로 바꾸면 보유 횟수가 예상대로 작동합니다. User이에서

+0

이렇게했습니다. 고마워요! – NewbiZ

2

:

- (void) release 

가되어야한다

- (void) dealloc 

당신은 혼합되어 nameuser 메모리 관리 - 각 객체는 자신의 메모리입니다 있습니다.

4) NSObjectrelease이 아닌 자신의 release 메서드를 호출하므로 예상대로 작동하지 않는다고 가정합니다. User에있는 release에서 dealloc으로 이름을 변경하십시오.

수정 된 후에 다른 문제가 있는지 살펴볼 수 있습니다.

관련 문제