【发布时间】:2012-06-16 14:20:43
【问题描述】:
如果我有一个将NSOperationQueue 作为实例变量的视图控制器,那么如果视图控制器被卸载,队列中正在执行的任何操作会发生什么情况?
【问题讨论】:
标签: iphone ios cocoa-touch nsoperation nsoperationqueue
如果我有一个将NSOperationQueue 作为实例变量的视图控制器,那么如果视图控制器被卸载,队列中正在执行的任何操作会发生什么情况?
【问题讨论】:
标签: iphone ios cocoa-touch nsoperation nsoperationqueue
我原来的答案中的愚蠢错误。我以前读错了这个确切的文档。真正的答案是没有定义会发生什么,或者至少没有记录。
正如我在 this answer 中提到的,有一些事情表明操作队列将被保留(例如 GCD 队列在执行块时被保留的事实)。
This question about autoreleasing an NSOperationQueue 也说了同样的话:
文档中没有说明释放 NSOperationQueue 时会发生什么。
您当然可以将“指定的操作保留在队列中直到它完成执行”解释为队列不会消失,直到入队的操作完成执行,但我仍然不会指望它。
但是,如果您想确保它们不会执行,则可以取消操作,方法是在视图控制器被卸载时告诉操作队列cancelAllOperations,如果您想防止这种情况发生。请注意,这些操作不会由它们自己停止。他们需要检查if ([self isCancelled]) { ... } 并停在那里。
所有操作都将完成执行,因为它们保留了队列。来自the documentation of addOperation:
讨论添加后,指定的操作会一直保留在队列中,直到执行完毕。
【讨论】: