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) 处,name 的保留计数从 2 减少到 1。但这是不正确的,数组中仍然存在指向 name 的 user 实例!仅当引用变量的保留计数为 0 时,变量的保留计数才应减少,也就是说,当它被释放而不是释放时。

4

2 回答 2

4

你不应该覆盖release,你应该只覆盖dealloc。当保留计数user达到零时,dealloc将调用它,释放name

如果您将release覆盖重命名为dealloc,则保留计数将按照您的预期运行。

于 2010-03-23T23:13:27.973 回答
2

User这:

- (void) release

应该:

- (void) dealloc

您正在混合nameuser内存管理 - 每个对象都有自己的内存。

在 4) 您调用自己的release方法不是NSObject'srelease所以我认为它不会按预期工作。在您release的.deallocUser

修复后,我们可以查看您还有哪些其他问题。

于 2010-03-23T23:15:18.987 回答