【问题标题】:EXC_BAD_ACCESS when using dispatch_async使用 dispatch_async 时的 EXC_BAD_ACCESS
【发布时间】: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


【解决方案1】:

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

以下症状:

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

可能表明这一点。

希望这对其他人有用!

【讨论】:

  • 这对我很有用,谢谢。拉扯我的头发试图弄清楚发生了什么,很高兴知道不是我的代码被破坏了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多