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

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

4

2 回答 2

13

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

于 2012-07-02T10:31:37.173 回答
3

首先没有理由调用 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);
于 2012-07-02T10:31:22.640 回答