私は iOS プログラミングの初心者です。NSFetchedResultsController を使用して CoreData が取り込まれた UITableView を実装しました。この部分は非常にうまく機能します。次に、テーブルを検索できるように UISearchDisplayController を追加しました。検索自体は正常に機能しますが、ビューをリロードすると CoreData オブジェクトがリークしているようです。アプリはクラッシュしませんが、検索を実行するか SearchView を閉じるたびに、Instrument が CoreData フレームワークでオブジェクトがリークしていると報告します。
次のような検索機能を実装しました。
- (void)filterContentForSearchText:(NSString*)searchText
scope:(NSString*)scope
{
if (searchText && searchText.length) {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains %@", searchText];
[self.fetchedResultsController.fetchRequest setPredicate:predicate];
}
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
// Handle error
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
}
SearchBar を閉じると、次のようになります。
- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
{
NSLog(@"searchBarTextDidEndEditing: Reset fetchedResultsController predicate" );
self.fetchedResultsController.fetchRequest.predicate = nil;
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@",error,[error userInfo]);
abort();
}
}
誰が私が間違っているのかを見ることができますか?
ありがとうカム
更新: この投稿に従い、NSFetchedResultsController (CoreData) を UISearchDisplayController/UISearchBar でフィルター処理する方法と同じ方法でゲッターを実装しましたが、検索バーにいくつかの文字を「入力」すると、まだコア データ オブジェクトがリークしているため、問題はビューを閉じずに新しいデータを取得しているとき。
コードは次のようになります。
1)検索バーに入力すると、nil self.searchBarFetchedResultsController に設定されます
(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
self.searchBarFetchedResultsController.delegate = nil;
self.searchBarFetchedResultsController = nil;
}
2) getter が再度呼び出されると、例に従って新しい FRC を割り当てます。
- (NSFetchedResultsController *)searchBarFetchedResultsController
{
if (_searchBarFetchedResultsController != nil)
{
return _searchBarFetchedResultsController;
}
_searchBarFetchedResultsController = [self newFetchedResultsControllerWithSearch:self.searchDisplayController.searchBar.text];
return _searchBarFetchedResultsController;
}
- (NSFetchedResultsController *)newFetchedResultsControllerWithSearch:(NSString *)searchString
{
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Beers"];
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains %@", searchString];
if(searchString.length)
{
[request setPredicate:predicate];
}
[request setFetchBatchSize:20];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:self.beerDB2.managedObjectContext
sectionNameKeyPath:nil
cacheName:nil];
aFetchedResultsController.delegate = self;
NSError *error = nil;
if (![aFetchedResultsController performFetch:&error])
}
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return aFetchedResultsController;
}
次に、デリゲート メソッドから FRC にアクセスしているときに、このメソッドを使用して正しいものを取得しています。
- (NSFetchedResultsController *)fetchedResultsControllerForTableView:(UITableView *)tableView
{
return tableView == self.favTab ? self.fetchedResultsController : self.searchBarFetchedResultsController;
}
インスペクターが何百ものコアデータオブジェクトをリークしていると言うことを除いて、すべてが完全に機能します:(そして、私が夢中になっているのは、常にリークしているわけではないということです.一部の検索では正常に機能し、リークが開始されます.その時点で.その後の検索はリークを引き起こします。