作为序言,这是对几天前进行的调查的跟进: https ://stackoverflow.com/questions/2981803/iphone-app-crashes-when-merging-managed-object-contexts
简短版本:EXC_BAD_ACCESS 正在使我的应用程序崩溃,并且僵尸模式显示罪魁祸首是我嵌入在我的 Fetched Results Controller 中的提取请求中的谓词。如果没有明确的命令,如何释放对象中的对象?
加长版:应用程序结构平台视图控制器 -> 游戏视图控制器(基于平台选择) -> 添加游戏视图控制器
当在 Platforms 视图上单击一行时,它会在 Games View 中为该平台设置一个实例变量,然后 Games Fetched Results Controller 以正常方式构建一个获取请求:
- (NSFetchedResultsController *)fetchedResultsController{
if (fetchedResultsController != nil) {
return fetchedResultsController;
}
//build the fetch request for Games
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Game"
inManagedObjectContext:context];
[request setEntity:entity];
//predicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"platform == %@",
selectedPlatform];
[request setPredicate:predicate];
//sort based on name
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name"
ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
//fetch and build fetched results controller
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc]
initWithFetchRequest:request
managedObjectContext:context
sectionNameKeyPath:nil
cacheName:@"Root"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
[sortDescriptor release];
[sortDescriptors release];
[predicate release];
[request release];
[aFetchedResultsController release];
return fetchedResultsController;
}
在这个方法的最后,fetchedResultsController 的 _fetch_request -> _predicate 成员被设置为一个 NSComparisonPredicate 对象。世界上一切都很好。
当 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 被调用时,_predicate 现在是一个僵尸,当表尝试更新自身时,它最终会使应用程序崩溃。
我或多或少感到困惑。我没有发布获取的结果控制器或它的任何部分,唯一获得 dealloc 的部分是谓词。有任何想法吗?
编辑:作为测试,我将此行添加到 Fetched Results Controller 方法中:
[fetchedResultsController.fetchRequest.predicate retain];
现在它没有崩溃,但这似乎是一个补丁,而不是我应该做的事情。