的文档+[NSThread detachNewThreadSelector:toTarget:withObject:]
说:
对于非垃圾收集的应用程序,该方法
aSelector
负责为新分离的线程设置一个自动释放池,并在它退出之前释放该池。
NSAutoreleasePool
我的问题是,我是否需要在我的方法覆盖中创建自己的-[NSOperation main]
,或者是由NSAutoreleasePool
处理的创建NSOperation
?
的文档+[NSThread detachNewThreadSelector:toTarget:withObject:]
说:
对于非垃圾收集的应用程序,该方法
aSelector
负责为新分离的线程设置一个自动释放池,并在它退出之前释放该池。
NSAutoreleasePool
我的问题是,我是否需要在我的方法覆盖中创建自己的-[NSOperation main]
,或者是由NSAutoreleasePool
处理的创建NSOperation
?
好问题,即使苹果自己的文档和示例代码对此也不是很清楚。我相信我已经找到了答案:
因为操作是 Objective-C 对象,你应该总是在你的任务代码实现的早期创建一个自动释放池。自动释放池可防止在任务执行期间自动释放的 Objective-C 对象泄漏。尽管在执行您的自定义代码时可能已经有一个池,但您永远不应依赖该行为,而应始终提供自己的行为。
基本上,即使大卫提到可能有一个池,您仍然应该创建自己的池。
是的你是。您正在定义一个独立的工作, NSOperationQueue 将在“某个”线程上执行,因此您负责管理该工作中的内存。
您无需在主程序中创建自己的 NSAutoreleasePool,系统会为您完成。要查看这一点,请使用 Xcode 菜单命令 Run > Show> Breakpoints 打开 Breakpoints 窗口并输入:-[NSAutoreleasePool init]
现在运行你的程序,你会看到在 NSOperation 中创建了一个自动释放池。
另请参阅 Apple 的示例,例如http://developer.apple.com/Cocoa/managingconcurrency.html不创建自己的自动释放池。
是的,您需要NSAutoreleasePool
在您的[NSOperation main]
方法中创建一个,除非您正在创建一个“并发”(有点不幸的命名法)NSOperation
子类,并且您的覆盖[NSOperation start]
方法NSAutoreleasePool
在调用 `[NSOperation main] 之前创建。
类文档对所有这些NSOperation
都有很好的描述:http:
//developer.apple.com/documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html。
是的,你需要。
- (void) main
{
NSAutoreleasePool *thePool = [[NSAutoreleasePool alloc] init];
//your code here
//more code
[thePool release];
}
如果你不创建自动释放池,任何方便的类初始化器(如 [NSString stringWithFormat:])都会泄漏,因为这些初始化器返回自动释放的对象。