1

私は何日もこれにいて、数日前にこの質問をしました。質問をもっと明確に言い換えた方が良いのではないかと思いました。

UINavigationController 内に一連の UICollectionViewControllers があります。ユーザーが選択を行うたびに、新しいコレクション ビューが画面にプッシュされ、このコレクション ビューが API からコンテンツを取得します。

時々、この時点でクラッシュが発生します。例外は毎回異なります。通常、次のいずれかです。

*** Collection <NSConcreteMapTable: 0x1922cf60> was mutated while being enumerated.

また

*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSSetM: 0x203f26b0> was mutated while being enumerated.'

例外をスローしないこともありますが、プログラムは「空のスレッド」で一時停止し、error: address doesn't contain a section that points to a section in a object file. 最後に、このエラーは、アイテムが選択され、新しいビューが押され、表示されたらすぐに戻るボタンが押されたときに、より一貫して再現可能です。ただし、戻るボタンを押さなくても発生する可能性があります。

スタック トレースを出力するために、独自のキャッチされていない例外ハンドラをアタッチしました。いずれの場合も、自分のクラスはトレースに含まれていません。

「例外でブレーク」を設定しましたが、意味のある場所で停止することはありません。通常trap、UIApplicationMain を読み取るだけの説明のないアセンブリ コードです。

だから私の質問は次のとおりです。どこからこれをデバッグし始めますか?

役立つ場合は、スタック トレースの例を投稿できます。

4

1 に答える 1

0

まず、Xcode で例外ブレークポイントを設定します。例外がスローされる前に停止するため、誰がそれを引き起こしたのかがわかります。

起こっているように見えるのは、コードがあることです

for (id object in somearray) ...

そのループの実行中に、誰かが somearray を変更します。それは致命的です。おそらく、コードの書き方について考える必要があります。たとえば、次のように書くことができます

for (id object in [somearray copy]) ...

その後、somearray を好きなだけ変更できます。コードがスレッド セーフでなく、あるスレッドが反復処理中に別のスレッドが somearray を変更している可能性があります。

于 2015-05-14T20:15:42.783 に答える