2011-05-19 20 views
2

我正在使用Apple提供的標準代碼執行核心數據提取,它在提取方法的開始處具有以下語句。在覈心數據中執行新的提取iphone

- (NSFetchedResultsController *)fetchedResultsController { 

    if (fetchedResultsController_ != nil) { 
     return fetchedResultsController_; 
    } 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 

    NSEntityDescription *entity = [NSEntityDescription entityForName:self.entityName inManagedObjectContext:self.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    // Set the batch size to a suitable number. 
    [fetchRequest setFetchBatchSize:20]; 

    // Edit the sort key as appropriate. 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:self.sortFieldName ascending:YES]; 
    NSMutableArray *sortDescriptors = [[NSMutableArray alloc] initWithObjects:sortDescriptor, nil]; 

    [fetchRequest setSortDescriptors:sortDescriptors]; 
    if(predicate != nil) 
     [fetchRequest setPredicate:predicate]; 

    // Edit the section name key path and cache name if appropriate. 
    // nil for section name key path means "no sections". 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:sectionKeyName cacheName:nil]; 

    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController = aFetchedResultsController; 

    [aFetchedResultsController release]; 
    aFetchedResultsController = nil; 
    [fetchRequest release]; 

    fetchRequest = nil; 
    [sortDescriptor release]; 
    [sortDescriptors release]; 

    NSError *error = nil; 
    if (![fetchedResultsController_ performFetch:&error]) { 

    } 

    return fetchedResultsController_; 
} 

第一次,fetchedResultsController獲取所需的信息。但在此之後,我正在爲此結果設置一個謂詞。所以,我希望下次考慮我的謂詞。如果進入上面的代碼,它會立即出來,因爲舊的值不是零。

爲了克服這個問題,設置謂語之後,我做

fetchedResultsController_ = nil; 

該工程確定,但在fetchedResultsController只要fetchRequest被分配給泄漏。

有沒有更好的方法來重新執行抓取或避免泄漏?

回答

1

只需添加一個版本。

if(fetchedResultsController_){ 
    [fetchedResultsController_ release]; 
} 
fetchedResultsController_ = nil; 
+0

下劃線是什麼意思? – RyeMAC3 2011-06-16 01:38:54

+0

無論如何,這解決了我的問題。我在運行該代碼的導航欄中添加了一個「刷新」按鈕,然後添加了新的提取。 – RyeMAC3 2011-06-18 02:48:29