自动释放两次对象

时间:2012-07-02 10:23:03

标签: iphone ipad autorelease nsautoreleasepool

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

任何人都可以帮我讲述这段代码。将对象自动释放两次将发生的事情。当我运行代码时,我没有得到任何僵尸。为什么呢。

2 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:3)

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

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

但是在你发布的exmaple中你正在创建一个空字符串:

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

然后为其分配另一个字符串:

str = @"hii";

这意味着您分配的第一个字符串将会泄漏,您确实自动释放它,以便最终清理它。但是没有理由将字符串分配到第一位。

你可以这样做:

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