自动释放对象两次
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/…以上是关于自动释放对象两次的主要内容,如果未能解决你的问题,请参考以下文章