接近以下内容的正确方法是什么? 要获得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一起使用,还是这样做?
你的意思是什么“我得到一个Dealloc错误”?什么是错误,在哪里? – 2012-03-22 17:24:13
您不显示调用createFetchedResultController的代码。 – 2012-03-22 17:25:59
我添加了代码并释放了消息。先谢谢您的帮助! – 2012-03-22 18:49:25