【问题标题】:objective-c autoreleaseObjective-C 自动释放
【发布时间】:2010-08-08 06:04:22
【问题描述】:

我是 obj-c 的新手,无法理解 autorelease 函数。有人可以向我解释什么时候应该使用它吗?以及它与发布有何不同。我还需要重置自动释放池吗?如何?什么时候?

【问题讨论】:

标签: iphone objective-c


【解决方案1】:

调用autorelease 会安排release 消息在不久的将来某个时间通过将对象添加到最顶部的NSAutoreleasePool 发送到对象。当池收到drain 消息时,它会将release 发送给已添加到其中的所有对象。

autorelease 用于方法或函数需要放弃其对对象的所有权,但需要暂时防止其被deallocated 以便其调用者可以对其进行操作的情况。它还有助于创建包装 allocinitWith...autorelease 的“便利”方法,以简化分配对象的代码。

【讨论】:

  • 所以我需要手动排空 NSAutoreleasePool 对吗?这不是垃圾回收吗?我什么时候应该调用 drain 方法?
  • 您不需要排空主 NSAutoreleasePool,它会进行垃圾收集。但是,如果您创建自己的 NSAutoreleasePool,则需要自己释放它。如果您有一些代码正在分配大量自动释放的对象(大量内存),您可以在不再需要时立即释放池以释放该内存。如果是这种情况,您应该为这种情况设置一个新的 NSAutoreleasePool 并排空它,而不是排空主/应用程序池。
  • 它不会进行垃圾收集——iPhone 根本没有垃圾收集。但是,系统确实会在从主运行循环调度事件之前创建一个池,并在事件完成处理后将其排出。
【解决方案2】:

当您向一个对象发送-autorelease 时,它会被添加到一个列表(自动释放池)中,当该池被释放或耗尽时,列表中的每个对象都会收到一个-release 消息。

自动释放只不过是一种延迟消息机制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多