正确释放NSOperationQueue

11
我想知道在仍有一些操作运行的情况下,正确的释放ivar NSOperationQueue的方法是什么,这种情况通常发生在用户突然退出应用程序时。 在某些示例中,看到使用了waitUntilAllOperationsAreFinished方法,如下所示:

- (void)dealloc {
    [_queue cancelAllOperations];
    [_queue waitUntilAllOperationsAreFinished];
    [_queue release];
    ...

然而,许多人建议避免这样做,因为它会挂起运行循环。 那么正确的释放_queue的方法是什么?如果我不等待操作完成而只是继续释放,会发生什么?
1个回答

10
几乎所有情况下,调用cancelAllOperations将足以。唯一需要调用waitUntilAllOperationsAreFinished的情况是你确实需要在继续进行之前确保这些操作已完成。
例如,如果操作正在访问某些共享内存,并且如果您不等待,则最终会有两个线程同时写入该共享内存。但是,我想不出任何合理的设计会通过在dealloc方法中造成阻塞延迟来保护共享内存。有更好的同步机制可用。
所以简短的答案是:除非您的应用程序特别需要等待所有操作完成,否则您不需要等待。

谢谢您的回答!所以我可以确定即使由于didReceiveMemoryWarning而调用dealloc,而不仅仅是在退出时,_queue也会被正确释放,不会有任何泄漏吗? - Tomas Camin
无论 dealloc 运行的原因是什么,你都不用担心。一旦操作清除完毕,队列就会被释放(当然,除非有其他对象保留了这个队列)。 - BJ Homer
1
除非 isSuspended 被设置为 YES,否则这将起作用。如果是这样,队列将不会释放队列中的操作。为了安全起见,如果您曾经在队列上调用过 setSuspended,请记得在取消操作后将其重置为 NO。 - vfn
有人能详细说明一下当NSOperationQueue本身被释放时,当前正在执行的操作的命运吗?队列本身会等待其操作完成(同步),还是在执行过程中将它们释放,或者强制将它们移动到“已完成”状态,以便可以删除它们? - Motti Shneor
1
队列在所有操作完成(或取消)之前不会被释放。 - BJ Homer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接