私は最近、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++に移動されます(これは自己回答質問です)低レベルを維持したいと考えました。
あなたは 'dispatch_async'の中で何をしているのかの例を見せてもらえますか? – Oskar
@Oskarコードを追加 –