ios - 自动释放池什么时候耗尽?

标签 ios objective-c memory-management

我研究手动内存管理,我想知道自动释放池何时耗尽。

我发现有3种情况: 1 - 在 main.m 中,从应用程序运行开始,一直到结束,因此释放内存中的所有对象。 2 - 当您显式地手动创建一个自动释放池并耗尽它时

第三种情况是我要的,它让我有点困惑。

据我研究,autorelease 对象就像 C 中的自动变量,仅存在于逻辑范围内(在函数体中)。因此,我假设在每个函数之后都有一个隐藏的 [pool drain];

但是,有人向我指出,这并不像我想的那样正确。 Apple 表示,它会在“事件”后耗尽。该事件可能会在用户点击按钮时发生,例如重新加载 TableView 。

但是这些信息不足以了解全貌。你能为我澄清一下,什么时候池会完全耗尽对象,比如 NSArray *arr = [NSArray array];

最佳答案

文档没有具体说明“主”自动释放池何时耗尽,但通常您可以假设它在应用程序的主事件循环结束时耗尽。

以下是关于自动释放池的情况:

  1. 在应用程序启动时创建一个自动释放池。
  2. 当另一个池被创建时,它被添加到自动释放池堆栈的顶部。
  3. autorelease 被发送到一个对象时,它被添加到堆栈顶部的自动释放池中。
  4. release 被发送到自动释放池时,它会依次将 release 发送到池中的任何对象。

#4 通常在主事件循环结束时自动发生(对于主自动释放池)。

NSAutoreleasePool 的文档有更多信息,包括这个相关的花絮:

The Application Kit creates an autorelease pool on the main thread at the beginning of every cycle of the event loop, and drains it at the end, thereby releasing any autoreleased objects generated while processing an event.

关于ios - 自动释放池什么时候耗尽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30515230/

相关文章:

ios - 如何在core graphics ios中连续绘制曲线

ios - Coreplot 图缩放问题

ios - removeItemAtPath 文件大小

memory-management - 为什么访问未映射的位置不会产生硬件异常 (Microblaze)

c++ - 我是否正确使用 delete[] 运算符?

ios - 开放式简历 iOS 的 HSV 范围

ios - TFileStream.Create 在具有某些设备语言的 iOS 上失败

c++ - 考虑到缓存一致性的高性能应用程序的POD数学结构类的C++选择按值传递还是按引用传递

ios - 使用 Swift 在 IOS 上的 Twitter 单点登录

ios - 为什么我的 UITableView 中有一个 float 的 "2"?