作業中のiPhoneコアデータアプリケーションで問題が発生しました。オブジェクトを一覧表示するテーブルがあります。これらのオブジェクトの1つを選択すると、オブジェクトの詳細を表示する新しいViewControllerに移動します。
詳細ビューには、メインリストビューに戻るための戻るボタンがあります。
行はいくつでも選択でき、それぞれの詳細ビューが表示されます。ただし、すでに選択した行を選択しようとすると、次のようにクラッシュします。
プログラム受信信号:「EXC_BAD_ACCESS」。
いくつかのブレークポイントを追加してこれを追跡しようとしましたが、tableViewcellForRowAtIndexPathメソッドで次のようになりました...
MyEntity * thingsamy = [fetchedResultsController objectAtIndexPath:indexPath]を実行すると、オブジェクトごとに最初に通過します。thingamyは有効であり、有効なthingamyに設定されます。gdbでは、この時点でブレークポイントを設定して、
pothingamyと私は期待される出力を取得します。
ただし、2回目に特定の行を選択した場合(たとえば、行0を選択して戻り、行0を再度選択した場合)、thingamyが正しく設定されていません。
他の行はいくつでも表示できますが、行を選択しようとするとすぐに、その詳細が表示されます。
ブレークポイントを設定していて、それを設定した後でpothingamyを実行しようとすると、次のようになります。
プログラム受信信号EXC_BAD_ACCESS、メモリにアクセスできませんでした。理由:アドレスでのKERN_PROTECTION_FAILURE:objc_msgSend()の0x000000200x92ca3ed7
fetchedResultsControllerが最初の呼び出しで有効なオブジェクトを返すが、2番目の呼び出しでは返さない理由はありますか?
アップデート
数日後、fetchedResultsControllerが割り当て解除されることに問題はないことを確信しています。NSZombieEnabledモードを有効にしましたが、何もありません。
さらに、既にアクセスしたオブジェクトだけでなく、fetchedREsultsControllerから他のオブジェクトを取得できます。
たとえば、[fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]を取得して、次のビューに表示できます。
戻って親ビューに戻ると、indexPathForRow:0 inSection:1でオブジェクトを取得し、それを表示できます。
もう一度最初に戻って、indexPathForRow:0 inSection:0を取得しようとすると、EXC_BAD_ACCESSでクラッシュします。
100行のテーブルでは、すべての行を1回取得できますが、同じ行を2回取得しようとすると、次々に試行してもクラッシュします。