gpt4 book ai didi

iphone - Dealloc'd 谓词导致 iPhone 应用程序崩溃!

转载 作者:行者123 更新时间:2023-12-03 20:26:42 25 4
gpt4 key购买 nike

作为前言,这是几天前进行的调查的后续行动: https://stackoverflow.com/questions/2981803/iphone-app-crashes-when-merging-managed-object-contexts

简短版本:EXC_BAD_ACCESS 正在使我的应用程序崩溃,僵尸模式揭示了罪魁祸首是嵌入在我的获取结果 Controller 中嵌入的获取请求中的谓词。如果没有明确的命令,如何释放对象中的对象?

长版:应用结构平台 View Controller -> 游戏 View Controller (根据平台选择) -> 添加游戏 View Controller

当在平台 View 上单击一行时,它会在游戏 View 中为该平台设置一个实例变量,然后游戏获取结果 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 现在是一个 Zombie,当表尝试更新自身时,它最终将使应用程序崩溃。

我或多或少感到困惑。我不会释放获取的结果 Controller 或其任何部分,唯一被释放的部分是谓词。有任何想法吗?

编辑:作为测试,我将此行添加到 Fetched Results Controller 方法中:

[fetchedResultsController.fetchRequest.predicate retain];

现在它没有崩溃,但这看起来像是一个补丁,而不是我应该做的事情。

最佳答案

您不应该释放您的谓词变量。您没有调用 newallocretaincopy(这是“narc”规则)创建谓词,因此您不负责释放它。这就是你的僵尸的来源。

关于iphone - Dealloc'd 谓词导致 iPhone 应用程序崩溃!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2994616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com