0

接近以下内容的正确方法是什么? 要获得CoreData对象的列表,我有一个'datamanager',我在其中创建一个NSFetchResultController,执行搜索,并使用这些对象生成NSFetchResultsController。通过使用保留取得autorelease对象的所有权?

因为可以有多个表,所以在每个请求上都需要创建一个新的FetchedResultsController,以便允许自动更新它们关联的tableViews。

我所做的是在DataManager中创建FetchedResultController,然后autorelease它。 在TableViewController中,我保留它(假设它将拥有它)。

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

这将调用DataManager的:

- (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时放置'retain'而不是'autorelease'时,它一切正常,但这似乎不正确的编码实践,因为'所有者'不释放目的。我不认为'复制',或者与ManagedObjects一起使用,还是这样做?

+0

你的意思是什么“我得到一个Dealloc错误”?什么是错误,在哪里? – 2012-03-22 17:24:13

+0

您不显示调用createFetchedResultController的代码。 – 2012-03-22 17:25:59

+0

我添加了代码并释放了消息。先谢谢您的帮助! – 2012-03-22 18:49:25

回答

0

在非ARC环境中,正确的方法是返回对象自动释放,然后,如果对象的使用将持续超出接收过程的范围(并且递归地调用它的过程,回到最接近的自动释放边界),应该保留该对象,并提供规定(通常在“拥有”对象的dealloc方法中)以1对1为基础释放保留。

请注意,在对象可能有条件保留的情况下需要注意 - 不要释放您未保留的内容。

+0

解决上述注释。谢谢您的帮助! – 2012-03-22 19:05:05