应用程序在同一行的第二个选择上崩溃

时间:2010-01-19 20:01:00

标签: iphone cocoa core-data nsfetchedresultscontroller

我遇到了我正在处理的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行的表中,我可以获得每一行一次,但任何尝试同一行的两次崩溃都会崩溃,即使这些尝试是一个接一个的。

4 个答案:

答案 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部分,我正在释放一些变量而不是释放它们。现在我已经将这些更改为发布,一切都按预期工作。