我们最近修改了线程机制,支持使用 dispatch_async
在大多数地方(在阅读了大量有关 NSOperation 与 dispatch_async 的内容之后)*。然后我们的代码开始在代码的各个部分崩溃并出现 EXC_BAD_ACCESS,总是在 dispatch_async(queue,...)
上。部分,没有清晰的图案。通常发生在 20 分钟 - 2 小时后。
我们的dispatch_async
block 用于通知监听器,如下所示:
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);
});
}
}
你的常见症状是:
(这是一个自我回答的问题)
*我们喜欢
dispatch_async
的简单性, 不需要 NSOperationQueue
的阻塞/依赖特性的,我们很快就会转向 C++,所以希望保持低水平。
最佳答案
经过几天的调试,确保我们的线程对象被强保留,并尝试了各种弱强组合和使用 Instruments 进行彻底的 profiling,我们得出的结论是 这是一个 Apple 错误 (以及 reported here )仅出现在最近的 iOS 版本上(对我们来说是 iOS10,但我认为它将在 libBacktraceRecording.dylib
开始出现时的版本中出现)。
症状:
可能表明这一点。
希望这对其他人有用!
关于ios - 使用 dispatch_async 时的 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43715624/