2010-03-23 28 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

修复后,我们可以看看你有什么其他问题。