【问题标题】:Properly dealloc NSOperationQueue正确地释放 NSOperationQueue
【发布时间】:2011-06-08 14:11:27
【问题描述】:

我想知道解除分配 ivar NSOperationQueue 的正确方法是什么,以防它仍在运行一些操作,这通常发生在用户突然退出应用程序时。在一些示例中,我看到使用了 waitUntilAllOperationsAreFinished,如下所示:


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

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

【问题讨论】:

    标签: iphone nsoperation dealloc nsoperationqueue


    【解决方案1】:

    在几乎所有情况下,调用cancelAllOperations 就足够了。您唯一需要致电waitUntilAllOperationsAreFinished 的情况是您是否确实需要确保在继续之前完成这些操作。

    例如,如果操作正在访问某个共享内存,您可能会这样做,如果您不等待,那么您最终将有两个线程同时写入该共享内存。但是,我想不出任何合理的设计可以通过在dealloc 方法中造成阻塞延迟来保护共享内存。有更好的同步机制可用。

    所以简短的回答是:您不需要等待所有操作完成,除非您的应用程序特别需要它。

    【讨论】:

    • 感谢您的回答!所以我可以确定 _queue 将被正确释放,即使由于 didReceiveMemoryWarning 而调用了 dealloc,也不会发生泄漏,而不仅仅是在退出时?
    • 是的,不管 dealloc 运行的原因是什么,你都会没事的。一旦操作清除,队列将被释放。 (当然,除非有其他对象保留了队列。)
    • 除非isSuspended 设置为YES,否则这将起作用。如果是,则队列不会释放队列中的操作。为安全起见,如果您曾在队列中调用 setSuspended,请记住在取消操作后将其重置为 NO。
    • 当 NSOperationQueue 本身被释放时,谁能详细说明当前正在执行的操作的命运?队列本身是否会等待其操作完成(同步)或在执行过程中释放它们,或者以其他方式强制将它们移动到“完成”状态,以便可以移除和删除它们?
    • 队列在所有操作完成(或取消)之前不会被释放
    猜你喜欢
    • 1970-01-01
    • 2011-05-07
    • 2016-06-24
    • 2014-12-17
    • 1970-01-01
    • 2011-06-01
    • 2011-09-09
    • 2010-12-30
    • 2015-11-18
    相关资源
    最近更新 更多