3

私は 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;

}

インスペクターが何百ものコアデータオブジェクトをリークしていると言うことを除いて、すべてが完全に機能します:(そして、私が夢中になっているのは、常にリークしているわけではないということです.一部の検索では正常に機能し、リークが開始されます.その時点で.その後の検索はリークを引き起こします。

4

1 に答える 1

0

「viewdidload」で、グローバルに宣言された配列のすべての詳細を取得します...そして検索機能で、「NSPredicate」を使用して配列をフィルタリングします

于 2015-08-08T20:26:54.030 に答える