释放对象:[obj release];是不够的,需要[obj release],obj = nil;?

时间:2011-09-08 21:32:39

标签: objective-c memory-management null retaincount

我在这里得到了一些丑陋的代码:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy"];
NSDate *date = [NSDate date];
NSString *textWithYear = [NSString stringWithFormat:@"text and year %@", [dateFormatter stringFromDate:date] ];
[dateFormatter release];
NSLog(@"%i", [dateFormatter retainCount]); // returns 1 !

如您所见,保留计数器返回1,我想这意味着该对象未被释放。 如果我将该字符串更改为

[dateFormatter release], dateFromatter = nil;

保留计数器返回0,这可能是因为它无法计算nil的保留:)

是否有一些我对保留计数器不了解的东西,或者这个对象真的没有发布?当我第二次发送release(努力获得零保留计数)时,它会预期粉碎:)

还有一个问题:如果dateFormatter真的被释放了,为什么当我调用[dateFormatter retainCount]时它不会崩溃?

1 个答案:

答案 0 :(得分:7)

你正确地释放你的对象;不要担心保留计数。并且不要使用-retainCount。有关原因的详细信息,请参阅When to use -retainCount?Calling -retainCount Considered Harmful

请注意,如果对象确实被破坏,那么此处的代码将崩溃(因为在您释放它之后调用-retainCount并且可能是悬挂指针);完成后将变量设置为nil是一个很好的习惯,可以防止这种情况发生。但它与您的代码是否泄漏无关。