25

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

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

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

4

5 回答 5

14

好问题,即使苹果自己的文档和示例代码对此也不是很清楚。我相信我已经找到了答案:

因为操作是 Objective-C 对象,你应该总是在你的任务代码实现的早期创建一个自动释放池。自动释放池可防止在任务执行期间自动释放的 Objective-C 对象泄漏。尽管在执行您的自定义代码时可能已经有一个池,但您永远不应依赖该行为,而应始终提供自己的行为。

基本上,即使大卫提到可能有一个池,您仍然应该创建自己的池。

于 2010-02-04T22:06:17.110 回答
12

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

于 2008-10-08T20:01:19.163 回答
6

您无需在主程序中创建自己的 NSAutoreleasePool,系统会为您完成。要查看这一点,请使用 Xcode 菜单命令 Run > Show> Breakpoints 打开 Breakpoints 窗口并输入:-[NSAutoreleasePool init]

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

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

于 2008-12-01T23:13:25.873 回答
2

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

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

于 2008-10-09T04:39:17.713 回答
0

是的,你需要。

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

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

于 2009-10-22T09:55:43.030 回答