0

シンボリック化された現在の iPhone アプリのクラッシュ ログがありますが、まだ問題が何であるかを解読するのに苦労しています。

基本的な問題は、特定のデバイス (特に古いデバイス) でアプリがクラッシュしてホーム画面に戻ることです。ユーザーがしばらくして私のゲームに戻ってきたときのようです - これにより、Game Center へのログイン プロセスが開始されます。クラッシュ ログの関連部分を以下に貼り付けました。

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x2e000000
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libobjc.A.dylib                 0x37c11f7e objc_msgSend + 22
1   Transfer Quiz                   0x000023c4 -[GameCenterManager callDelegate:withArg:error:] (GameCenterManager.m:113)
2   Transfer Quiz                   0x0000230c __60-[GameCenterManager callDelegateOnMainThread:withArg:error:]_block_invoke_0 (GameCenterManager.m:103)
3   libdispatch.dylib               0x346fdc52 _dispatch_call_block_and_release + 6
4   libdispatch.dylib               0x346ffee0 _dispatch_main_queue_callback_4CF$VARIANT$mp + 188
5   CoreFoundation                  0x358432a6 __CFRunLoopRun + 1262
6   CoreFoundation                  0x357c649e CFRunLoopRunSpecific + 294
7   CoreFoundation                  0x357c6366 CFRunLoopRunInMode + 98
8   GraphicsServices                0x37462432 GSEventRunModal + 130
9   UIKit                           0x332d2cce UIApplicationMain + 1074
10  Transfer Quiz                   0x000030d4 main (main.m:16)
11  Transfer Quiz                   0x000021a8 start + 32

GameCenterManager callDelegate の次のコードは次のとおりです。

- (void) callDelegate: (SEL) selector withArg: (id) arg error: (NSError*) err
{
assert([NSThread isMainThread]);
if([delegate respondsToSelector: selector])
{
    if(arg != NULL)
    {
        [delegate performSelector: selector withObject: arg withObject: err];
    }
    else
    {
        [delegate performSelector: selector withObject: err];
    }
}
else
{
    NSLog(@"Missed Method");
}
}

このコードは、外部のチュートリアル Web サイトのチュートリアルの一部でした。ここでアプリがクラッシュする原因となっている問題を特定できません。

コードがクラッシュを引き起こしている理由を知っている人はいますか? どんな助けでも大歓迎です。どのデバイスでもクラッシュを再現するのは非常に難しいと感じており、おそらくクラッシュを再現できないために NSZombies を使用しても機能しません。

よろしくお願いします。

4

1 に答える 1

0

呼び出しているセレクターは、「arg」と「error」の 2 つの引数を取るようです。問題は、「arg」が nil の場合、セレクターを1 つの引数に対してのみ呼び出していることです。つまり、2 番目の引数は基本的にゴミであり、セレクターが呼び出されたオブジェクトが 2 番目の引数にアクセスしようとすると、クラッシュします。 . 全体として、それは必要ありませんif()-常に両方の引数をセレクターに渡し、最初の引数が nil であるかどうかをデリゲートに検出させます。

于 2012-09-09T16:02:04.483 に答える