自动释放对象两次

Posted

技术标签:

【中文标题】自动释放对象两次【英文标题】:Autoreleasing twice an object 【发布时间】:2012-07-02 10:23:02 【问题描述】:
NSString *str = [[[[NSString alloc]init]autorelease]autorelease];
str = @"hii";
NSLog(@"%@",str);      

谁能帮我介绍一下这段代码。会发生什么。当我运行代码时,我没有得到任何僵尸。为什么会这样。

【问题讨论】:

【参考方案1】:

当自动释放池被销毁时,对象被释放两次,这可能是在运行循环迭代结束时。它不会崩溃的原因是,NSString 在某些情况下返回单例,例如您创建的空字符串或字符串文字(您应该 NOT 依赖它,这正是当前发生的情况!) ,这些对象不会被释放,这就是你不会得到僵尸的原因。

【讨论】:

如果不是字符串,而是另一个类怎么办?【参考方案2】:

首先没有理由调用 autorelease 两次。

一旦一个对象被标记为自动释放,再次调用它的自动释放将被忽略。见https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsautoreleasepool_Class/Reference/Reference.html

但在您发布的示例中,您正在创建一个空字符串:

NSString *str = [[[[NSString alloc]init]autorelease]autorelease];

然后你给它分配另一个字符串:

str = @"hii";

这意味着您分配的第一个字符串将被泄漏,您确实自动释放了它,因此它会在最后被清理。但是没有理由将字符串分配在第一个位置。

你可以这样做:

NSString *str =@"hii";
NSLog(@"%@",str);

【讨论】:

“再次调用 autorelease 将被忽略”不正确。对象被两次添加到自动释放池中,当池耗尽时将被释放两次。这是文档:developer.apple.com/library/mac/#documentation/Cocoa/Reference/…

以上是关于自动释放对象两次的主要内容,如果未能解决你的问题,请参考以下文章

在自动释放池 内释放创建的自动释放对象 [关闭]

iPhone 开发 - 释放一个自动释放的对象

如何找到带有自动释放消息的对象?

何时释放带有“自动释放”的对象?

iphone:多次自动释放对象

释放自动释放对象不会使我的应用程序崩溃,为啥?