ios - 使用 dispatch_async 时的 EXC_BAD_ACCESS

标签 ios grand-central-dispatch exc-bad-access dispatch dispatch-async

我们最近修改了线程机制,支持使用 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);
    });
  }
}


你的常见症状是:
  • 在 iOS10 上发生,在 iOS8 上永远不会发生
  • 在调试期间发生,但从未在生产中报告

  • (这是一个自我回答的问题)

    *我们喜欢 dispatch_async 的简单性, 不需要 NSOperationQueue 的阻塞/依赖特性的,我们很快就会转向 C++,所以希望保持低水平。

    最佳答案

    经过几天的调试,确保我们的线程对象被强保留,并尝试了各种弱强组合和使用 Instruments 进行彻底的 profiling,我们得出的结论是 这是一个 Apple 错误 (以及 reported here )仅出现在最近的 iOS 版本上(对我们来说是 iOS10,但我认为它将在 libBacktraceRecording.dylib 开始出现时的版本中出现)。

    症状:

  • 在 iOS8.x 上无法重现
  • 仅在 Debug模式下发生
  • EXC_BAD_ACCESS 在代码的随机部分,没有任何模式

  • 可能表明这一点。

    希望这对其他人有用!

    关于ios - 使用 dispatch_async 时的 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43715624/

    相关文章:

    ios - 在 swift UICollectionview 中更新单个单元格

    ios - 有什么方法可以使 dispatch_queue_t 在单线程中工作?

    ios - 更改 View Controller 维护导航层次结构

    ios - HTTP POST 请求后 UIView 更改延迟

    ios - 不调用 responseJSON 的 Alamofire completionHandler

    ios - 为什么使用 GCD 和 block 进行 HTTP 下载?

    ios - 如何避免嵌套 block

    ios - 使用 Xcode 5.1.1 在 iOS 中启用和调试 Zombie 对象

    iphone - EXEC_BAD_ACCESS (code=1 address=0x90000008) 切换 View Controller 时

    iphone - audioPlayerDidFinishPlaying : called之后的EXC_BAD_ACCESS