繁体   English   中英

GCD创建队列错误

[英]GCD create queue error

我使用了GCD。 ARC项目。 第二次调用此代码时,项目崩溃...

if (self.queue)
{
        dispatch_suspend(self.queue);
        self.queue = NULL;
}    
self.queue = dispatch_queue_create("com.myapp.blabla.queue", NULL);
dispatch_async(self.queue, ^{
        [self hardMethod];
});

self.queue = NULL;字符串self.queue = NULL; 需要,停止并释放旧队列并创建新队列

挂起一个队列然后放弃对该队列的唯一引用不可能实现您认为的目标。

从理论上讲,您会希望泄漏:当您调用dispatch_suspend ,当前正在执行的任务将完成,但是所有挂起的任务将被挂起(并保持对队列的强引用)。 更糟糕的是,由于您仅丢弃了对队列的引用,因此您将无法恢复队列并释放这些资源。 从理论上讲,您将泄漏队列和任何排队的调度块(以及那些排队的块具有强引用的任何对象)。

实际上,当您执行此操作(删除对iOS 6+中暂停队列的最后一个强引用)时,它将崩溃。 也许iOS确实应该更优雅地处理此问题,但是尽管如此,删除最后一个对挂起队列的引用从而无法恢复它的场景也就不足为奇了。

最重要的是,不要挂起队列,然后尝试释放它。 如果要取消后台任务,则可能要使用操作队列而不是Grand Central Dispatch。 操作队列可以更优雅地处理可取消的操作,如果使用NSOperation子类,甚至可以编写代码来处理可能正在进行的操作的取消。

如果您真正想要做的是在开始新的调用之前取消对hardMethod的先前调用,那么您应该真正检查一下NSOperationNSOperationQueue ,它们明确支持取消操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM