gpt4 book ai didi

ios - 使用 dispatch_async 时的 EXC_BAD_ACCESS

转载 作者:行者123 更新时间:2023-12-01 17:47:38 25 4
gpt4 key购买 nike

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

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com