0

以下にアプローチする適切な方法は何ですか? CoreDataオブジェクトのリストを取得するには、私はNSFetchResultControllerを作成し、検索を行い、NSFetchResultsControllerをオブジェクトとともに使用する 'datamanager'を持っています。retainを使用してオートリリースオブジェクトの所有権を取得していますか?

複数のテーブルが存在する可能性があるため、関連付けられているテーブルビューの自動更新を可能にするために、各要求に新しいFetchedResultsControllerを作成する必要があります。

私が行うことは、DataManagerでFetchedResultControllerを作成し、それを自動解放することです。 TableViewControllerでは、私はそれを保持しています(所有権があると仮定します)。

NSFetchedResultsController* objects = [[delegate dataManager] getMenu:parentMenu];   
    _objects = [objects retain]; 

これは、データマネージャーを呼び出します。

- (NSFetchedResultsController*) getMenu:(DOMenuItem*) parentMenu { 
    NSPredicate* predicate; 
    if(parentMenu == nil){ 
     predicate = [NSPredicate predicateWithFormat:@"(parent == NULL)", parentMenu]; 
    } else {  
     predicate = [NSPredicate predicateWithFormat:@"(parent == %@)", parentMenu];  
    } 

    [NSFetchedResultsController deleteCacheWithName:_cacheName]; 

    NSFetchedResultsController* aFetchedResultsController = [self createFetchedResultsController];  
    [aFetchedResultsController.fetchRequest setPredicate:predicate]; 
    [aFetchedResultsController.fetchRequest setFetchLimit:0]; 

    NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:_defaultSortField ascending:YES] autorelease]; 
    NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortDescriptor, nil] autorelease]; 

    [aFetchedResultsController.fetchRequest setSortDescriptors:sortDescriptors];   

    // Fetch the records and handle an error 
    NSError *fetchError; 

    if (![aFetchedResultsController performFetch:&fetchError]) { 
     // Handle the error. 
     // This is a serious error and should advise the user to restart the application 
     NSLog(@"Fetching data error: %@", [fetchError localizedDescription]); 
    } 

    return aFetchedResultsController;  
} 

- (NSFetchedResultsController *) createFetchedResultsController {  
    NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:_objectName inManagedObjectContext:[self managedObjectContext]]; 
    [fetchRequest setEntity:entity]; 

    NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:_defaultSortField ascending:NO] autorelease]; 
    NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortDescriptor, nil] autorelease]; 

    [fetchRequest setSortDescriptors:sortDescriptors]; 

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[self managedObjectContext] sectionNameKeyPath:_sectionNameKeyPath cacheName:_cacheName]; 

    return [aFetchedResultsController autorelease]; 
} 

しかし、私はライン上の呼び出しにこのFetchedResultController上DEALLOCエラーを取得する状況で実行しています。

if(indexPath.section == [[_objects sections] count] + 1){ 

メッセージは次のとおりです。

* - [NSFetchedResultsControllerセクション]:メッセージが0xe3de1b0

割り当て解除インスタンスに送信され、この方法に何か問題はありますか? もしそうなら、作成するクラスからそれを保持する必要のあるクラスに所有権を移すための好ましい方法は何でしょうか。

編集: fetchedResultsControllerを返すときに 'autorelease'の代わりに 'retain'を設定すると、すべて正常に動作しますが、 'owner'がオブジェクト。私は 'コピー'とは思わないか、ManagedObjectsで動作するのでしょうか?

+0

"Deallocエラーが発生しました"という正確な意味はありますか?エラーは何ですか? –

+0

createFetchedResultControllerを呼び出すコードは表示されません。 –

+0

コードを追加し、メッセージを割り当て解除しました。助けを前にありがとう! –

答えて

0

非ARC環境で適切な方法は、オブジェクトの使用が受信プロシージャの範囲を超えて持続する場合(および再帰的に呼び出されたプロシージャ、最も近い自動解放境界に戻る)、オブジェクトは、1対1ベースで保持を解放するためのプロビジョニング(通常は「所有」オブジェクトのdeallocメソッドで)によって保持される必要があります。

オブジェクトが条件付きで保持される場合は注意が必要です。保持しなかったものは解放しないでください。

+0

上記のように解決します。助けてくれてありがとう! –

関連する問題