我对释放和自动释放仍然有一些不清楚的理解。它们之间有什么区别?我有这个代码。对于Facebook连接。当我去Facebook登录时有时会崩溃,我怀疑是因为我不能很好地发布这个对象。感谢您的帮助
if (_session.isConnected) {
[_session logout];
} else {
FBLoginDialog* dialog = [[[FBLoginDialog alloc] initWithSession:_session] autorelease];
[dialog show];
}
答案 0 :(得分:22)
Memory Management Programming Guide for Cocoa很快就会成为你最好的朋友。简而言之,Cocoa中的对象实例是使用引用计数进行内存管理的(当然,除非你在OS X上使用垃圾收集)。对象表示它希望通过向其发送-retain
消息来“保留”其他实例中的所有者权益 - 防止其被解除分配。对象表示它希望通过向另一个实例发送-release
消息来释放该兴趣。如果对象中具有“保留”和所有者权益的对象数量下降到0(即最后一个拥有实例发送-release
消息),则取消分配具有0保留计数的实例。
有时可以很方便地说“我希望此实例在将来的某个时间发布”。这就是-autorelease
的目的。发送-autorelease
消息会将接收者添加到当前NSAutoreleasePool
。当该池耗尽时,它会向池中的所有实例发送-release
消息。在每个线程的运行循环的每次迭代开始时自动创建NSAutoreleasePool
,并在该迭代结束时排空。因此,您可以在方法中执行以下操作:
- (id)myMethod {
return [[[MyObject alloc] init] autorelease];
}
此方法的调用者将返回一个他们可以-retain
的实例,如果他们希望保留它。如果它们没有保留它,它将至少粘住,直到封闭的自动释放池耗尽:
- (void)someOtherMethod {
...
id instance = [obj myMethod];
... // do more with instance, knowing that it won't be dealloc'd until after someOtherMethod returns
}
答案 1 :(得分:8)
发布意味着您立即释放。 自动释放意味着您希望在下一个自动释放池中释放该变量。
如果要保留变量但不想创建内存泄漏,则使用自动释放。当你不再需要变量时使用release。
样品:
- (NSNumber *)return5 {
NSNumber * result = [[NSNumber alloc]initWitnInt: 5];
[result autorelease];
return result;
}
为什么我们在那里使用自动释放?
如果我们使用[result release],那么变量结果将被销毁。这意味着返回的值将是垃圾。
如果我们根本没有发布,变量result
将永久保留,导致内存泄漏。
我们可以告诉每个调用者函数释放结果但是这会很头疼并容易出错。
所以我们使用autorelease。我们将变量标记为在下一个自动释放池中释放。基本上我们标记要在alloc附近释放的变量。因此,mantra alloc与同一函数中的release一起保持配对。
实际上,您可以将所有版本更改为自动释放。您的记忆使用效率不高,但影响很小。所有编程语言中的所有变量都是有效自动释放的。
无论如何,请使用ARC。
答案 2 :(得分:4)
背景讨论:
objective-c是引用计数,因此当引用计数达到0时删除对象。释放会立即减少引用计数,自动释放会在弹出自动释放池时减少它
何时使用:
在分配对象时使用自动释放
使用“手动”发布
但真的是我的弗兰德:
埃里克
答案 3 :(得分:3)
根据Memory Management Programming Guide for Cocoa:
自动释放方法,由。定义 NSObject,标记接收器以供日后使用 发布。通过自动释放 对象 - 也就是说,通过发送它 autorelease消息 - 你声明了 你不想拥有这个对象 超出您发送的范围 自动释放。
此外:
因此,自动释放方法允许 每个对象都使用其他对象 而不用担心处置 它们。