我何时何地应该排出NSAutoreleasePool?

时间:2012-03-20 18:54:09

标签: objective-c

我了解如何将项目添加到NSAutoreleasePool以及如何在之后排空池。但是,我的教育中缺少的是何时何地应该这样做。

显然,在Main中执行此操作毫无意义,因为这与从不释放内存完全不同。但到目前为止我所阅读的文件并未向我提供任何其他指导。

3 个答案:

答案 0 :(得分:2)

当您在循环中分配自动释放的对象时,使用自动释放池很有用,这将减少底层自动释放池的内存消耗峰值。

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html

中关于自动释放池的更多信息

答案 1 :(得分:1)

main中的自动释放池满足了应用程序对Cocoa的责任,即自动释放池始终可用。这个池在主事件循环的每个循环中都被耗尽。

此外,您创建的每个NSThread都必须拥有自己的自动释放池。

除此之外,这只是在主要自动释放池耗尽之前估计您创建的自动释放对象的数量的问题。您还可以使用Instruments查看峰值内存占用量,作为可以使用自动释放池的进一步证据。

答案 2 :(得分:1)

您需要手动管理NSAutoreleasePool对象的唯一时间是在线程中运行。如果线程没有使用太多内存,那么在开始时排空并在结束时排空。否则每次循环迭代都会耗尽。耗尽池之间的迭代次数取决于您在池中使用的内存量。你流失的频率越高,你的内存使用效率就越高。

如果您正在为具有数万个粒子的粒子系统做这样的事情,那么最好不要分配&一直释放内存,而是分配一次并使用环形缓冲区或类似的东西。