【问题标题】:Releasing objects: [obj release]; is not enough, need [obj release], obj = nil;?释放对象:[obj release];还不够,需要[obj release],obj = nil;?
【发布时间】:2011-11-13 08:42:20
【问题描述】:

这里有一些丑陋的代码:

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 !

如你所见,retains 计数器返回 1,我想这意味着对象没有被释放。 如果我将该字符串更改为

[dateFormatter release], dateFromatter = nil;

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

关于保留计数器有什么我不明白的地方,或者这个对象真的没有释放吗?当我第二次向它发送release 时(努力使保留计数为零),它会按预期粉碎:)

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

【问题讨论】:

    标签: objective-c memory-management null retaincount


    【解决方案1】:

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

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

    【讨论】:

    • 一个问题:如果dateFormatter真的被释放了,为什么我调用[dateFormatter retainCount]时它不崩溃?..
    • @Seamus 你的意思是“如果对象确实被释放了”,对吧?可能还有其他引用使其保持活力。
    • @Richard - 是的;事实上,其他引用显然使该对象保持活力。已编辑,谢谢。
    • 也可能是巧合。释放内存不会改变内容,因此,悬空指针似乎会继续工作,直到内存上出现乱涂乱画。
    • (这就是为什么你不能依靠retainCount 告诉你任何事情。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 2011-09-22
    相关资源
    最近更新 更多