自动释放对象两次

7
NSString *str = [[[[NSString alloc]init]autorelease]autorelease];
str = @"hii";
NSLog(@"%@",str);      

有人能帮我解释这段代码吗?如果一个对象被自动释放两次会发生什么?当我运行这段代码时,我没有收到任何僵尸对象的警告。为什么会这样?

2个回答

13
当自动释放池被销毁时,对象会被释放两次,这可能发生在运行循环迭代的末尾。为什么不崩溃呢?因为 NSString 对于某些实例返回单例,例如您创建的空字符串或字符串字面量(您不应该依赖它,但目前是如此!),这些对象不会被释放,这就是为什么没有出现僵尸对象的原因。请注意,保留了NOT标签。

如果不是字符串,而是另一个类,该怎么办? - nekonari

3

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

一旦一个对象被标记为autorelease,再次调用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);

6
"calling autorelease on it again will just be ignored" 不正确。这个对象将被添加两次到自动释放池中,在池被清空时会被释放两次。以下是文档链接:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsautoreleasepool_Class/Reference/Reference.html - user23743

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接