我遇到了我正在处理的iPhone核心数据应用程序的问题。我有一个列出对象的表。如果我选择其中一个对象,我会转到一个新的ViewController,它显示对象的细节。
在详细视图中,我有一个后退按钮,可以将我带回主列表视图。
我可以选择任意数量的行,它会显示每个行的详细视图。但是,如果我尝试选择我已选择的行,则会崩溃
收到信号: “EXC_BAD_ACCESS”。
我添加了一些断点并尝试跟踪它,并在我的tableView cellForRowAtIndexPath方法中找到以下内容......
当我做每个对象时,第一次通过 MyEntity * thingamy = [fetchedResultsController objectAtIndexPath:indexPath] thingamy有效并设置为有效的东西。在gdb中,我可以在此处设置断点并执行
po thingamy 我得到了预期的输出。
但是,第二次选择特定行(例如选择行0,返回,再次选择行0)时,没有正确设置thingamy。
我可以查看任意数量的其他行,但只要我尝试选择一行,我就已经查看了详细信息。
如果我有断点并且在设置之后我尝试做一个po thingamy,我得到以下内容:
程序收到信号EXC_BAD_ACCESS,无法访问内存。 原因:地址为KERN_PROTECTION_FAILURE:0x00000020 objc_msgSend()中的0x92ca3ed7
知道为什么fetchedResultsController在第一次调用时返回一个有效的对象,而不是第二次调用?
更新
几天之后,我很肯定,对于fetchedResultsController进行dealloc'd不是问题。我启用了NSZombieEnabled模式,那里什么都没有。
此外,我可以从fetchedREsultsController中获取其他对象,而不是我已经访问过的对象。
例如,我可以得到 [fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]并在我的下一个视图中显示。
当我回击并回到父视图时,我可以在indexPathForRow获取对象:0 inSection:1并显示该对象。
再次回到开头,我尝试获取indexPathForRow:0 inSection:0并且它与EXC_BAD_ACCESS崩溃。
在一个包含100行的表中,我可以获得每一行一次,但任何尝试同一行的两次崩溃都会崩溃,即使这些尝试是一个接一个的。
答案 0 :(得分:1)
我对NSFetchedResultsController有这个确切的问题。我通过turning on NSZombieEnabled in Xcode解决了这个问题。在我的情况下,事实证明我过度释放了NSFetchedResultsController。
我第一次加载数据时工作,但后来我发布它却没有意识到。下一次,我发布了我已发布的相同实例,它会崩溃。
如果仍有问题,请发布NSFetchedResultsController初始化代码。
答案 1 :(得分:0)
听起来像回到列表时实际上已被破坏,指针不再引用有效的内存地址。你有什么东西可以处理这个清单吗?
答案 2 :(得分:0)
您是否实施了以下方法?
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
// In the simplest, most efficient, case, reload the table view.
//[self.tableView reloadData];
}
也许在那里抛出一个断点,看看内容是否在变化?鉴于NSFetchResultsController的谈话,我想你可能会遇到这样的情况。
答案 3 :(得分:0)
我终于找到了答案!
在我的dealloc部分,我正在释放一些变量而不是释放它们。现在我已经将这些更改为发布,一切都按预期工作。