5

在 iOS/CocoaTouch 上,我经常看到在方法中创建新的 NSAutoreleasePool 实例的代码。我最近在 NSOperation 中看到了一个。

设置新的 NSAutoreleasePool 实例的基本规则是什么?为什么这比简单地依赖在 main.m 中创建的预先存在的发布池更可取?

谢谢,
道格

4

3 回答 3

6

您可以随时使用新的自动释放池,但这并不总是有益的。每当您启动一个新线程或该线程中自动释放的对象将被泄漏时,它都是必需的。在创建和自动释放大量对象的方法中创建新的自动释放池也很常见。例如,如果您有一个循环在 50 次迭代中每次创建 10 个对象,那么您应该考虑为该方法创建一个自动释放池,如果不是作为循环的一部分,以便为每次迭代创建一个新对象。

于 2011-03-06T22:34:20.067 回答
3

当还没有一个池时(例如在一个新线程中),或者当运行循环中的池不够用时(在一个循环中创建自动释放的对象,它将运行多次迭代),或者当您想要更好地控制您创建的自动释放对象何时最终释放时。

于 2011-03-06T22:49:13.853 回答
1

我在 iOS 4.3 中进行了测试,执行 performSelectorInBackground 时需要创建自己的自动释放池。使用 NSOperation 或 dispatch_async 时不需要创建。

似乎在 iOS >= 5.0 中,即使使用 performSelectorInBackground,系统也会自动创建自动释放池,所以当您需要创建自己的自动释放池时,我无法找到案例。

但是,无法找到记录的更改。

于 2012-09-12T14:49:00.490 回答