1

私は最近、dispatch_asyncを(NSOperationとdispatch_asyncについて多くの読書を行った後で)ほとんどの場所で使用することに賛成してスレッド機構を改訂しました。その後、コードのさまざまな部分でEXC_BAD_ACCESSを使用してコードが破損し始めました。これは常に明確なパターンがなく、dispatch_async(queue,...)部分です。通常、20分〜2時間後に発生します。dispatch_asyncを使用する場合のEXC_BAD_ACCESS

当社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); 
 
    }); 
 
    } 
 
}

一般的な症状であったY:

  • iOS10で発生し、iOS8に起こることはありません
  • デバッグ中には発生しますが、 n個の生産

我々はdispatch_asyncのシンプルさを気に入っ*

NSOperationQueue年代のブロック/依存関係の機能を必要としなかったし、我々はすぐにC++に移動されます(これは自己回答質問です)低レベルを維持したいと考えました。

+0

あなたは 'dispatch_async'の中で何をしているのかの例を見せてもらえますか? – Oskar

+0

@Oskarコードを追加 –

答えて

4
デバッグの日後

、私たちのスレッドオブジェクトを強く保持して確実に、そして楽器を使用して、さまざまな弱の強い組み合わせと徹底プロファイリングをしようが、我々はこれは(もreported hereとして)アップルのバグあるという結論になってきたこと最新のiOSバージョン(iOS10では表示されますが、libBacktraceRecording.dylibが表示されたときにバージョンから表示されると思います)。

症状:iOS8.x

    • 再現できないだけ示している可能性があります任意のパターン

    せずに、デバッグモードで時にコードのランダムな部分で

  • EXC_BAD_ACCESS起こりますこの。

    これは他のユーザーにとって便利です。

  • +0

    これは私にとって非常に便利です、ありがとうございます。何が起こっているのか把握しようとしている私の髪を引き出し、それは私のコードが壊れていないことを知っている。 –

    関連する問題