我是一名初学者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时减少,即,当它被解除分配,而不是释放时。
答案 0 :(得分:4)
您不应该覆盖release
,您应该只覆盖dealloc
。当user
的保留计数达到零时,将调用其dealloc
,释放name
。
如果您将release
覆盖重命名为dealloc
,则保留计数将按预期运行。
答案 1 :(得分:2)
在User
中:
- (void) release
应该是:
- (void) dealloc
您正在混合name
和user
内存管理 - 每个对象都有自己的内存。
在4)您调用自己的release
方法,而不是NSObject
release
,因此我认为它不会按预期工作。将您的release
上的名称从dealloc
更改为User
。
修复完成后,我们可以查看您遇到的其他问题。