3

We have an iOS game on the AppStore and some users are reporting problems since they've upgraded to iOS 7. We've updated the game to work on iOS 7 and have tested it extensively with several devices. However, we have some users reporting crashes, sometimes in the exact same devices we've tested and re tested the game on. The crash log, after being symbolicated, reads as follows:

Thread 0 Crashed:
0   CoreGraphics                    0x2d4ec9ca CGColorSpaceGetModel + 10
1   QuartzCore                      0x2f893842 CA_CGColorGetRGBComponents + 30
2   QuartzCore                      0x2f95a142 -[NSObject(CAAnimatableValue) CA_distanceToValue:] + 86
3   UIKit                           0x2fe10c72 _UIViewLayerAnimationCanBeConsideredFinished + 250
4   UIKit                           0x2fe10ae2 __22-[UIWindow sendEvent:]_block_invoke + 10
5   CoreFoundation                  0x2d3c4022 __53-[__NSArrayI enumerateObjectsWithOptions:usingBlock:]_block_invoke + 50
6   CoreFoundation                  0x2d3bda0a -[__NSArrayI enumerateObjectsWithOptions:usingBlock:] + 218
7   UIKit                           0x2fc1b556 -[UIWindow sendEvent:] + 522
8   UIKit                           0x2fbf0a20 -[UIApplication sendEvent:] + 192
9   UIKit                           0x2fbef21c _UIApplicationHandleEventQueue + 7092
10  CoreFoundation                  0x2d446188 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 12
11  CoreFoundation                  0x2d445656 __CFRunLoopDoSources0 + 202
12  CoreFoundation                  0x2d443e4a __CFRunLoopRun + 618
13  CoreFoundation                  0x2d3aece2 CFRunLoopRunSpecific + 518
14  CoreFoundation                  0x2d3aeac6 CFRunLoopRunInMode + 102
15  GraphicsServices                0x320cf27e GSEventRunModal + 134
16  UIKit                           0x2fc50a3c UIApplicationMain + 1132
17  MyGame                          0x00104382 main (main.m:13)
18  MyGame                          0x0010435c ___lldb_unnamed_function455$$MyGame + 36

I have absolutely no idea where to go from here, any suggestions will be greatly appreciated.

4

3 に答える 3

1

主に例外 (割り当て解除されたインスタンス? 欠落しているセレクター?) など、クラッシュ レポートに欠けているものがありますが、それでもいくつか推測できます。

[UIWindow sendEvent:]

これは、イベント処理からの呼び出しであり、おそらくユーザーによるタッチです。

UIKitコードは、アクティブなアニメーションがあるかどうかを確認することで、イベントを配信できるかどうかを確認すると思い_UIViewLayerAnimationCanBeConsideredFinishedます。

また、ウィンドウレイヤーのアニメーションだと思います。独自のウィンドウを作成したり、ビューを に直接追加したりしていますUIWindowか? それとも、ルート ビュー コントローラーをアニメーションで変更するのでしょうか?

とにかく、アニメーション中に画面をタッチしてみてください。表示されているビューと表示されていないビューの両方を常に試してください。

于 2013-10-03T19:19:01.637 に答える
1

これが問題だと思います

5 CoreFoundation 0x2d3c4022 __53- [__NSArrayI enumerateObjectsWithOptions:usingBlock:] _block_invoke + 50

ずらしたアニメーションにブロック列挙子を使用していたところ、アプリがクラッシュし、次のメッセージが表示されました」

[UIViewAnimationState release]: 割り当て解除されたインスタンスに送信されたメッセージ

私はARCと静的メソッド呼び出しを使用しているので、なぜこれが起こっているのかわかりません.

ただし、このループを foreach スタイルのループに変更すると、問題が修正されました。ブロック内のブロックは iOS5 および 6 では正常に機能しましたが、iOS7 では奇妙な結果になり、その後クラッシュしました。

于 2013-10-03T19:05:26.080 に答える
0

enumerateObjectsWithOptions:usingBlock はバックグラウンド スレッドを利用します。これらのバックグラウンド スレッドの 1 つが GUI オブジェクトで動作する場合 (もちろん、アニメーションはこれに含まれます)、クラッシュします。

クラッシュが発生したら、Xcode の左側に移動し、デバッグ ナビゲーターを選択します。ほとんどの場合、スレッド x が等しくないスレッド 1 でクラッシュが発生します。GUI スレッドであるスレッド 1 のみが GUI で再生できます。

問題を解決するには、少なくとも 2 つのオプションがあります。

a)dispatch_asyncまたはdispatch_syncブロック内に行うアニメーションGUI作業を次のように配置します

    …enumerateObjectsWithOptions:usingBlock … {

        // non GUI stuff    

        dispatch_async(dispatch_get_main_queue(), ^{ 
            // GUI work
            // non GUI stuff is also okay here
        });

        // non GUI stuff  

} // end of enumerateObjectsUsingBlock  

b) enumerateObjectsWithOptions:usingBlock の代わりに高速列挙を使用し、この方法でバックグラウンド スレッドを回避します。

iOS 7 はより多くの内部スレッドを使用しており、おそらく iOS 6 はこれらの呼び出しでバックグラウンド スレッドを使用できなかったため、6 では問題が発生しなかったが、7 では問題が発生したと思います。

楽しむ!

于 2013-12-13T10:52:42.020 に答える