0

作業中の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回取得しようとすると、次々に試行してもクラッシュします。

4

4 に答える 4

1

NSFetchedResultsControllerでこの正確な問題が発生しました。XcodeでNSZombieEnabledをオンにすることで解決しました。私の場合、NSFetchedResultsControllerを過剰にリリースしていたことがわかりました。

初めてデータを読み込んだときは動作しましたが、気付かずにリリースしていました。次回は、すでにリリースしたのと同じインスタンスをリリースしましたが、クラッシュしました。

引き続き問題が発生する場合は、NSFetchedResultsController初期化コードを投稿してください。

于 2010-01-19T22:55:26.210 に答える
0

次のメソッドを実装していますか?

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    // In the simplest, most efficient, case, reload the table view.
    //[self.tableView reloadData];
}

おそらく、そこにブレークポイントを投げて、コンテンツが変化しているかどうかを確認しますか? NSFetchResultsController の話を考えると、これが役立つシナリオにいる可能性があると思いました。

于 2010-01-19T22:07:18.967 に答える
0

私はついにこれに対する答えを見つけました!

私の dealloc セクションでは、多くの変数を解放するのではなく、割り当てを解除していました。これらをリリースに変更したので、すべてが期待どおりに機能しています。

于 2010-02-14T18:03:39.050 に答える