+[NSThread detachNewThreadSelector:toTarget:withObject:]
的文档说:
对于非垃圾收集的应用程序,方法
aSelector
负责 用于为新分离的线程设置自动释放池并释放 退出之前的那个游泳池。
我的问题是,我是否需要在覆盖NSAutoreleasePool
方法时创建自己的-[NSOperation main]
,还是创建由NSAutoreleasePool
处理的NSOperation
?
答案 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:])都会泄漏,因为这些初始化器会返回自动释放的对象。