释放和自动释放有什么区别?

时间:2010-01-16 06:18:57

标签: objective-c memory-management autorelease

我对释放和自动释放仍然有一些不清楚的理解。它们之间有什么区别?我有这个代码。对于Facebook连接。当我去Facebook登录时有时会崩溃,我怀疑是因为我不能很好地发布这个对象。感谢您的帮助

if (_session.isConnected) {
        [_session logout];
    } else {
        FBLoginDialog* dialog = [[[FBLoginDialog alloc] initWithSession:_session] autorelease];
        [dialog show];
    }

4 个答案:

答案 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时删除对象。释放会立即减少引用计数,自动释放会在弹出自动释放池时减少它

何时使用:

在分配对象时使用自动释放

  • 在当前功能之后你不需要它
  • 它将由其他一些objet /函数重新发布,稍后将通过保留代码发布
  • 当前函数的逻辑很棘手时,你必须在返回之前在十几个不同的地方发送版本

使用“手动”发布

  • 恢复先前的保留(如果您正在实施库)
  • 如果您需要精确控制释放对象(例如,他们使用大量内存或自动释放池将不会弹出一段时间)

但真的是我的弗兰德:

埃里克

答案 3 :(得分:3)

根据Memory Management Programming Guide for Cocoa

  

自动释放方法,由。定义   NSObject,标记接收器以供日后使用   发布。通过自动释放   对象 - 也就是说,通过发送它   autorelease消息 - 你声明了   你不想拥有这个对象   超出您发送的范围   自动释放。

此外:

  因此,自动释放方法允许   每个对象都使用其他对象   而不用担心处置   它们。