NSAutoreleasePool在NSOperation主要?

时间:2008-10-08 19:16:18

标签: cocoa cocoa-touch multithreading

+[NSThread detachNewThreadSelector:toTarget:withObject:]的文档说:

  

对于非垃圾收集的应用程序,方法aSelector负责   用于为新分离的线程设置自动释放池并释放   退出之前的那个游泳池。

我的问题是,我是否需要在覆盖NSAutoreleasePool方法时创建自己的-[NSOperation main],还是创建由NSAutoreleasePool处理的NSOperation

5 个答案:

答案 0 :(得分:14)

好问题,即使Apple自己的文档和示例代码也不是很明确。我相信我找到了答案:

  

因为操作是Objective-C   对象,你应该总是创建一个   早期的自动释放池   实现您的任务代码。一个   自动释放池提供保护   反对Objective-C的泄漏   在期间自动释放的对象   你的任务执行。虽然有   可能已经是一个到位的游泳池了   自定义代码执行的时间,   你永远不应该依赖这种行为   并且应该始终提供自己的。

基本上,即使David提到可能有一个游泳池,你仍然应该创建自己的游泳池。

答案 1 :(得分:12)

是的,你这样做。您正在定义一个独立的工作,NSOperationQueue将在“某个”线程上执行,因此您负责管理该工作中的内存。

答案 2 :(得分:6)

您不需要在主系统中创建自己的NSAutoreleasePool,系统会为您完成。要查看此内容,请使用Xcode菜单命令Run>展会>断点打开“断点”窗口并键入: - [NSAutoreleasePool init]

现在运行你的程序,你会看到在NSOperation中创建了一个自动释放池。

另请参阅Apple的示例,例如http://developer.apple.com/Cocoa/managingconcurrency.html,它们不会创建自己的自动释放池。

答案 3 :(得分:2)

是的,您需要在NSAutoreleasePool方法中创建[NSOperation main],除非您正在创建“并发”(略微不幸的命名法)NSOperation子类并且您的被覆盖[NSOperation start] }方法在调用`[NSOperation main]。

之前创建NSAutoreleasePool

NSOperation类文档对所有这些都有很好的描述: http://developer.apple.com/documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html

答案 4 :(得分:0)

是的,你需要。

- (void) main
{
  NSAutoreleasePool *thePool = [[NSAutoreleasePool alloc] init];
  //your code here
  //more code
  [thePool release];
}

如果你不创建一个自动释放池,任何方便的类初始化器(如[NSString stringWithFormat:])都会泄漏,因为这些初始化器会返回自动释放的对象。