2010-03-23 61 views
1

我是初學者的ObjectiveC程序員,來自C++世界。我覺得很難理解通過NSObject的提供的內存管理:/持有人保留財產時的行爲

說我有下面的類:

@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 

沒有考慮下面的代碼,我無法理解的保留計數結果:

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的保留計數達到零時,將調用其dealloc,釋放name

如果您將release覆蓋重命名爲dealloc,則保留計數將按照您的預期運行。

+0

工作正常!非常感謝你! – NewbiZ 2010-03-23 23:15:40

2

User這樣的:

- (void) release 

應該是:

- (void) dealloc 

你混合nameuser內存管理 - 每個對象都有它自己的內存。

在4)你打電話給你自己的release方法,這不是NSObjectrelease所以我認爲它不會按預期工作。在User上將名稱從release更改爲dealloc

修復後,我們可以看看你有什麼其他問題。