【发布时间】:2017-05-01 07:16:51
【问题描述】:
我们最近修改了我们的线程机制,支持在大多数地方使用dispatch_async(在阅读了大量有关 NSOperation 与 dispatch_async 的信息之后)*。然后我们的代码开始在代码的各个部分崩溃并出现 EXC_BAD_ACCESS,总是在 dispatch_async(queue,...) 部分,没有明确的模式。通常在 20 分钟 - 2 小时后发生。
我们的dispatch_async 块用于通知侦听器,如下所示:
NSMutableSet *_listeners; // Initialised elsewhere and filled with interested listeners
void(^block)(id listener); // Block to execute
@synchronized(_listeners) {
for (id listener in _listeners) {
dispatch_async_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // We used different queues for different listeners, but showing only one type of queue here for brevity
dispatch_async(queue, ^{ // CRASHING LINE
block(listener);
});
}
}
你的常见症状是:
- 在 iOS10 上发生,在 iOS8 上永远不会发生
- 在调试期间发生,但从未在生产中报告
(这是一个自我回答的问题)
*我们喜欢dispatch_async 的简单性,不需要NSOperationQueue 的阻塞/依赖特性,我们很快就会转向C++,所以希望保持低水平。
【问题讨论】:
-
您能否举例说明您在
dispatch_async中所做的事情? -
@Oskar 添加代码
标签: ios grand-central-dispatch exc-bad-access dispatch dispatch-async