dispatch_after
アプリケーションが何らかの動作を実行するためにロードされているときに、GCD のメソッドを使用しています。意図した動作はapplicationDidFinishLaunchingWithOptions
、バックグラウンド キューで実行されるセレクターを実行するために、 の終了から 3 秒待機することです。
テスト デバイスでクラッシュを経験したことはありませんが、BUS_ADRALN 例外が原因で SIGBUS シグナルがキャッチされないというユーザー クラッシュ レポートがあります。このコードの理解から、BUS_ADRALN エラーはアドレス アライメント エラーを示します。
これは私がタイマーを作成する方法です:
double delayInSeconds = 3.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),
^(void){
[self methodToPerformInBackground];
});
このクラッシュの原因は何ですか?
マルチスレッド エラーは奇妙な獣のようなものになる可能性があるため、頭の中で考えていたいくつかのアイデアを捨ててしまいます。
- への呼び出し内からこれを呼び出してい
[self performSelectorOnMainThread:withObject:waitUntilDone]
ます。このように呼び出されたセレクター内でこれを行うことに問題はありますか? - を呼び出しているので
dispatch_get_global_queue
、dispatch_create_queue
このメソッドによって返されたキューを保持する必要はありません。この推論は正しいですか? - このコードで
self
は、 はアプリケーション デリゲートです。アプリケーションがバックグラウンドに入るか終了した後にブロックを実行しようとすると、クラッシュが発生する可能性がありますか? アプリケーションは、終了時にディスパッチされたブロックを自動的にクリーンアップしますか? - 呼び出されているメソッド内の何かがクラッシュを引き起こしていますが、GCD はスタック トレースを提供しません。
編集:とにかくそれが主な問題であると確信していないので、ブロックで呼び出されるコードを含めたくありません。これがスタックトレースです。スレッド 0 でのクラッシュは、問題がブロックで呼び出されたコードではなく、GCD にあるように見えます。
編集 #2:クラッシュ レポートをさらに調べた後、共有する奇妙なニュースがあります。このクラッシュは、iOS 4.2.X 以下を実行しているユーザーにのみ表示されます。GCD は iOS 4.0 以降でサポートされているため、4.3 でパッチが適用されたバグがあったと思います。
Thread 0 Crashed:
0 libSystem.B.dylib 0x35e5fb10 _dispatch_retain + 0
1 libSystem.B.dylib 0x35e5df8c dispatch_after_f + 80
2 libSystem.B.dylib 0x35e5e070 dispatch_after + 72
3 MyApplication 0x0000466c -[MyApplicationDelegate applicationDidFinishLaunchingPart2:] (MyApplicationDelegate.m:366)
4 CoreFoundation 0x37538f79 -[NSObject(NSObject) performSelector:withObject:] + 25
5 Foundation 0x35171e6d __NSThreadPerformPerform + 273
6 CoreFoundation 0x375518d1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
7 CoreFoundation 0x37521ecd __CFRunLoopDoSources0 + 385
8 CoreFoundation 0x375216f9 __CFRunLoopRun + 265
9 CoreFoundation 0x3752150b CFRunLoopRunSpecific + 227
10 CoreFoundation 0x37521419 CFRunLoopRunInMode + 61
11 GraphicsServices 0x33e76d24 GSEventRunModal + 196
12 UIKit 0x3591d57c -[UIApplication _run] + 588
13 UIKit 0x3591a558 UIApplicationMain + 972
14 MyApplication 0x00003024 main (main.m:113)
Thread 1:
0 libSystem.B.dylib 0x35d8f974 kevent + 24
1 libSystem.B.dylib 0x35e5dd70 _dispatch_queue_invoke + 104
2 libSystem.B.dylib 0x35e5d790 _dispatch_worker_thread2 + 128
3 libSystem.B.dylib 0x35de6978 _pthread_wqthread + 400
Thread 2:
0 libSystem.B.dylib 0x35de72fc __workq_kernreturn + 8
Thread 3:
0 libSystem.B.dylib 0x35d5b3b0 mach_msg_trap + 20
1 CoreFoundation 0x37521f83 __CFRunLoopServiceMachPort + 95
2 CoreFoundation 0x37521787 __CFRunLoopRun + 407
3 CoreFoundation 0x3752150b CFRunLoopRunSpecific + 227
4 CoreFoundation 0x37521419 CFRunLoopRunInMode + 61
5 WebCore 0x3318bd1c _ZL12RunWebThreadPv + 532
6 libSystem.B.dylib 0x35de5b4c _pthread_start + 372
Thread 4:
0 libSystem.B.dylib 0x35d5b3b0 mach_msg_trap + 20
1 CoreFoundation 0x37521f83 __CFRunLoopServiceMachPort + 95
2 CoreFoundation 0x37521787 __CFRunLoopRun + 407
3 CoreFoundation 0x3752150b CFRunLoopRunSpecific + 227
4 CoreFoundation 0x37521419 CFRunLoopRunInMode + 61
5 Foundation 0x3517ec55 +[NSURLConnection(NSURLConnectionReallyInternal) _resourceLoadLoop:] + 217
6 Foundation 0x3515cb91 -[NSThread main] + 49
7 Foundation 0x35155b97 __NSThread__main__ + 915
8 libSystem.B.dylib 0x35de5b4c _pthread_start + 372