2

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_queuedispatch_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
4

1 に答える 1

1

DISPATCH_QUEUE_PRIORITY_BACKGROUNDはiOS5.0以降の機能です。iOS 4.xで使用しようとすると、NULLになります(GCDはCライブラリであり、Objective-CでのNULL使用方法は安全ではないため、保持しようとするとクラッシュします。 nil)。詳細については、この回答を参照してください。解決策は、代わりに低優先度を使用するか、プリプロセッサディレクティブを使用して2つを切り替えることです。

于 2012-06-25T23:46:49.530 に答える