0

この質問は、Xcode のマスター ディテール テンプレートと Core Data を使用する iPhone アプリに関するものです。アプリは iOS 5.1 以降をサポートしています。

NSFetchedResultsController を使用して、 UINavigationController スタックの 2 番目のビュー コントローラーである UITableView の項目を管理しています。ユーザーがテーブル ビューから選択すると、スタック内の 3 番目のビュー コントローラーがビューにプッシュされます。かなり標準的なもので、NSFetchedResultsController によって提供される Core Data オブジェクトへのアクセスが大幅に簡素化されていることを楽しんでいます。

3 番目のビュー コントローラーでは、ユーザーはテーブル ビューのリストから選択された一連のデータを見ています。このビューには、前または次のデータ セットに移動するためのボタンがいくつか追加されています。iOS のメール アプリと、メールを見ているときに表示される上下ボタンを考えてみてください。これらのボタンを使用して、メールのリスト (テーブル ビュー) に戻ることなく、リスト内の次または前のメールを選択できます。

これらの次/前のボタンのいずれかがタップされたときに、データ ストアからどのデータをロードする必要があるかを識別する最も簡単な方法を見つけようとしました。私が知る限り、これは、スタック内の前のビュー コントローラーからフェッチされた結果コントローラーを使用することです。テーブル ビュー内の次または前のインデックス パスの結果を返すよう Core Data に指示するだけです。

3 番目 (詳細) のビュー コントローラーでは、次のように 2 番目 (マスター) のビュー コントローラーのフェッチされた結果コントローラーにアクセスできます。

NSFetchedResultsController *fetch = [[self.navigationController.viewControllers objectAtIndex:1] fetchedResultsController];
NSIndexPath *indexPath = [fetch indexPathForObject:self.detailItem];
NSLog(@"Section: %d, Row: %d", indexPath.section, indexPath.row);

先に進む前に、View Controller とそのフェッチされた結果コントローラーが常に存在することを知っておく必要があります。私が理解しているように、メモリが不足するまで保持され、その時点で解放される可能性があります。詳細ビューは、データを表示するときに大量のメモリを消費する可能性があり、時間の経過とともにより多くのデータを収集するためにアプリが使用されるにつれて、より多くのメモリを消費します。

ユーザーが詳細ビュー コントローラーを操作している間、これらのアイテム (スタック内の前のビュー コントローラーとそのフェッチされた結果コントローラー) がメモリに残ることを確認できますか?

そうでない場合、確実に保持する方法はありますか?

それ以外の場合、目的を達成するためのより簡単でエレガントな方法はありますか?

4

2 に答える 2

0

2 番目のビュー コントローラーが解放されることはありません。また、メモリ不足の状況ではありません。何が起こるかとviewDidUnloadいうと、メモリ不足の状況で (iOS 6 では廃止され、呼び出されなくなりました) が呼び出されることです。NSFetchedResultsControllerそのため、その方法で自分を取り除かない限り、問題はありません。

于 2012-11-14T12:27:40.357 に答える
0

このメソッドがいつ呼び出されたかを知ることができます:

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
于 2012-11-14T12:32:13.593 に答える