5

iOS6(CoreDataを使用するアプリ)で次の例外が発生します:

"2012-10-15 10:21:28.952 MyApp [68650:c07] *キャッチされなかった例外によるアプリの終了'NSInvalidArgumentException'、理由:'* -[__ NSArrayM insertObject:atIndex:]:オブジェクトをnilにすることはできません' *最初のスロー呼び出しスタック:(0x28e6012 0x2659e7e 0x2899b6a 0x2899a20 0x1646941 0x1642c67 0x164f846 0x164f908 0x6c540 0x2057e83 0x28a5376 0x28a4e06 0x288ca82 0x288bf44 0x288be1b 0x33967e

これはiOS5では起こらないので、私が理解していないことがiOS6で起こります。insertObject:atIndex:を呼び出すすべてのポイントにブレークポイントを設定しましたが、これらは呼び出されません。このlibc ++ abi.dylib内で呼び出され、クラッシュするものである必要があります。誰かが何が間違っている可能性があるか知っていますか?

ありがとうございました

4

2 に答える 2

19

これはおそらく、iOS5 がこのエラーに対して例外をスローしなかったためです (また、例外をスローする必要がありましたが、iOS6 は後で異常な動作をするよりも優れた例外をスローしました)、または iOS6 でオブジェクトを作成するいくつかの異なる動作があるためですnil。 iOS5にはありません。

理由が何であれ、シンボルにシンボリック ブレークポイントを追加して、insertObject:atIndex:このメソッドが呼び出されるたびに、アプリケーション内 (独自のコード内かどうか) に関係なくブレークするようにすることができます。

  • "Breakpoints Navigator" ビューに移動します (Cmd-6ショートカット)
  • 「+」ボタンをクリックして、シンボリックブレークポイントを追加します シンボリック ブレークポイントを追加する
  • シンボルにヒットしたときにブレークするようにシンボリック ブレークポイントを設定します。[NSArray insertObject:atIndex:] シンボリック ブレークポイントの編集

したがって、最初のパラメーターの値でこれがいつ呼び出されたかを確認しnil、問題が発生した場所を修正できます。

代わりに、例外がスローされたときに中断する Exception Breakpointを追加して、コード内でいつ例外が発生したかを知ることもできます。これは、コードのどの部分 (自分のコードまたは別のコード) が例外を生成したかを知らせる別の方法です。

例外ブレークポイント

ブレークポイントに到達し、例外が発生する前にプログラムが停止したら、コードのどの部分が最後にこの例外をトリガーしたかをコール スタックで確認できます。

于 2012-10-15T09:10:48.800 に答える
17

クラッシュの理由は、挿入しようとしているオブジェクトがnil. これは、適切にインスタンス化されていないことを意味します。これは、その例外に到達する前に何かがうまくいかなかったことを意味します。

alloc挿入しようとしていたオブジェクトをed およびinitialized したコードを投稿できますか?

関連するコード行を見つけるには、次のことを試してください: Xcode プロジェクトの [例外] タブに移動します。

例外タブ

次に、「+」ボタン (ページの下部) をクリックし、「Add Exception Breakppoint ...」を選択します。すべての設定をデフォルトのままにして、[完了] をクリックします。

プロジェクトを再実行すると、例外がスローされる前に、関連するコード行で停止するはずです。次に、コール スタックを上に移動して、この動作の原因となっているライブラリ関数をコード内のどこから呼び出したかを特定できます。次に、この時点ですべてのオブジェクトが正しく初期化されているかどうかを確認してください。

于 2012-10-15T08:35:12.117 に答える