在iOS/CocoaTouch上,我经常看到代码在方法中创建一个新的NSAutoreleasePool实例。我最近在国家统计局内看到一个。NSAutoreleasePool。什么时候适合创建一个新的自动释放池?
设置NSAutoreleasePool的新实例的基本规则是什么?为什么这比单纯依靠在main.m中创建的预先存在的发布池更可取?
感谢,
道格
在iOS/CocoaTouch上,我经常看到代码在方法中创建一个新的NSAutoreleasePool实例。我最近在国家统计局内看到一个。NSAutoreleasePool。什么时候适合创建一个新的自动释放池?
设置NSAutoreleasePool的新实例的基本规则是什么?为什么这比单纯依靠在main.m中创建的预先存在的发布池更可取?
感谢,
道格
您可以使用一个新的自动释放池,只要你想要的,但它并不总是有益的。无论何时你开始一个新的线程或在该线程中autoreleased的对象都会被泄漏。在创建和自动释放大量对象的方法中创建新的自动释放池也很常见。例如,如果您有一个循环在50次迭代中每次创建了10个对象,则应该考虑为该方法创建一个自动释放池(如果不是循环的一部分),以便为每次迭代创建一个新对象。
创建自己的池时,如果还没有一个(如在一个新的线程中),或者当运行循环中的一个不足时(在循环中创建自动释放对象,将运行多个迭代),或者当你想要增加控制你创建的自动释放对象何时最终被释放。
我在iOS 4.3中测试过,当执行performSelectorInBackground时需要创建自己的自动释放池。使用NSOperation或dispatch_async时不需要创建。
似乎在iOS> = 5.0中,即使使用performSelectorInBackground,系统也会自动创建自动释放池,所以当您需要创建自己的自动释放池时,我无法找到一个案例。
虽然无法找到记录的变化。
何时本地autorelease池不利。我收集创建一个动机是为了细粒度的管理。此外,您声明必须为新线程创建新的自动释放池。这对NSOperations来说是否属实?我是一个狂热的测试者,并且没有发现mems漏洞与我目前缺乏本地autorelease池的NSOperations。 – dugla 2011-03-07 14:58:22
@dugla我不确定你是否需要为NSOperations创建一个。当一个对象没有池时自动释放,它会向控制台输出一条消息,所以你应该知道你是否需要一个。如果在生命周期内不创建大量对象,创建一个池是不利的,因为它会增加额外的分配并占用处理器周期。除非在其生命周期中使用objective-c对象,否则它不会有任何好处,因为其他对象不使用它。 – ughoavgfhw 2011-03-08 03:22:07