我正在使用一个dispatch_queue,它是通过其所有者的属性访问的,如下所示:
@property (nonatomic, assign) dispatch_queue_t queue;
请注意assign
关键词。队列在对象的整个生命周期中使用,因此由对象拥有。当拥有的对象被释放时,我释放队列:
-(void)dealloc
{
dispatch_release(self.queue);
self.queue = nil;
}
我该如何正确释放这个?会使用retain/release
work?
如果在调用释放时队列中有待处理/正在运行的内容,会发生什么情况?
以下内容是从开发者文档中窃取的:
调度队列和其他调度
对象是引用计数数据
类型。当您创建连续剧时
调度队列,它有一个初始的
引用计数为 1。您可以使用
调度保留和调度释放
递增和递减函数
根据需要引用计数。什么时候
队列的引用计数达到
零,系统异步
取消分配队列。
当您的应用程序不再需要
调度队列,它应该释放
它与dispatch_release函数一起使用。
任何提交给a的待处理块
队列保存对该队列的引用,
所以队列不会被释放,直到
所有待处理的块均已完成。
注意:您不需要保留或
释放任何全局调度
队列,包括并发
调度队列或主调度
队列。任何试图保留或
释放队列被忽略。
因此,任何需要使用 -retain 的地方都使用dispatch_retain,任何需要使用 -release 的地方都使用dispatch_release。
调度队列遵循与 Objective-C 对象相同的通用内存管理约定。并且在所有排队的块完成之前它们不会被释放。
如果您确实想要一种方法来关闭调度队列:无法通过任何类型的 API 取消所有排队的块,因此它们始终必须运行完成。加快此过程的一种方法是在管理调度队列的类中使用 BOOL 变量:_isValid。当你想关闭队列时,可以将_isValid设置为NO。提交到队列的所有块在执行任何工作之前都应首先检查 _isValid。
旁注:使用 NSOperationQueue 可能更合适。参见克里斯·汉森的博客文章 http://eschatologist.net/blog/?p=232.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)