自动释放池什么时候耗尽?
When do autorelease pools drain?
我研究手动内存管理,我想知道自动释放池何时耗尽。
我发现有3种情况:
1 - 在 main.m
中,从应用程序 运行 开始,最后耗尽,因此释放内存中的所有对象。
2 - 当您手动显式创建自动释放池并耗尽它时
第三种情况是我要求的,它让我有点困惑。
据我研究,autorelease 对象就像 C 中的自动变量,仅存在于逻辑范围内(在函数体中)。因此,我假设在每个函数之后都有一个隐藏的 [pool drain];
但是,有人向我指出它并不像我想的那样正确。 Apple 表示,它会在 "event" 后耗尽。当用户点击按钮时可能会发生该事件,例如 table 视图重新加载。
但是这些信息不足以了解全貌。你能为我澄清一下,什么时候池会完全耗尽对象,比如 NSArray *arr = [NSArray array];
?
文档没有具体说明 "main" 自动释放池何时耗尽,但通常您可以假设它在应用程序的主事件循环结束时耗尽。
以下是关于自动释放池的情况:
- 应用程序启动时会创建一个自动释放池。
- 创建另一个池时,它会添加到自动释放池堆栈的顶部。
- 当一个
autorelease
被发送到一个对象时,它被添加到堆栈顶部的自动释放池中。
- 当
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.
当我使用逆向工程工具分析 Foundation 框架时。然后我发现自动释放池在 runloop 开始时创建并在 runloop 结束时释放。
图片:
我研究手动内存管理,我想知道自动释放池何时耗尽。
我发现有3种情况:
1 - 在 main.m
中,从应用程序 运行 开始,最后耗尽,因此释放内存中的所有对象。
2 - 当您手动显式创建自动释放池并耗尽它时
第三种情况是我要求的,它让我有点困惑。
据我研究,autorelease 对象就像 C 中的自动变量,仅存在于逻辑范围内(在函数体中)。因此,我假设在每个函数之后都有一个隐藏的 [pool drain];
但是,有人向我指出它并不像我想的那样正确。 Apple 表示,它会在 "event" 后耗尽。当用户点击按钮时可能会发生该事件,例如 table 视图重新加载。
但是这些信息不足以了解全貌。你能为我澄清一下,什么时候池会完全耗尽对象,比如 NSArray *arr = [NSArray array];
?
文档没有具体说明 "main" 自动释放池何时耗尽,但通常您可以假设它在应用程序的主事件循环结束时耗尽。
以下是关于自动释放池的情况:
- 应用程序启动时会创建一个自动释放池。
- 创建另一个池时,它会添加到自动释放池堆栈的顶部。
- 当一个
autorelease
被发送到一个对象时,它被添加到堆栈顶部的自动释放池中。 - 当
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.
当我使用逆向工程工具分析 Foundation 框架时。然后我发现自动释放池在 runloop 开始时创建并在 runloop 结束时释放。
图片: