0

我正在使用的 iPhone 核心数据应用程序遇到问题。我有一个列出对象的表。如果我选择其中一个对象,我会转到一个显示对象详细信息的新 ViewController。

在详细视图中,我有一个返回按钮,可将我带回到主列表视图。

我可以选择任意数量的行,它会显示每个行的详细视图。但是,如果我尝试选择我已经选择的行,它会崩溃

程序接收信号:“EXC_BAD_ACCESS”。

我添加了一些断点并试图追踪它,并在我的 tableView cellForRowAtIndexPath 方法中找到了以下内容......

当我执行 MyEntity *thingamy = [fetchedResultsController objectAtIndexPath:indexPath] thingamy 时,每个对象的第一次是有效的并设置为有效的thingamy。在 gdb 中,我可以在此时设置断点并执行

po thingamy 我得到了预期的输出。

但是,我第二次选择特定行(例如选择第 0 行,返回,再次选择第 0 行)时,thingamy 设置不正确。

我可以查看任意数量的其他行,但是当我尝试选择一行时,我已经查看了发生这种情况的详细信息。

如果我有断点,并且在设置后尝试执行 po thingamy,我会得到以下信息:

程序收到信号 EXC_BAD_ACCESS,无法访问内存。原因:KERN_PROTECTION_FAILURE at address: 0x00000020 0x92ca3ed7 in objc_msgSend()

知道为什么 fetchedResultsController 在第一次调用时返回一个有效对象,而不是第二次调用吗?

更新

几天后,我很肯定 fetchedResultsController 被释放不是问题。我启用了 NSZombieEnabled 模式,但那里什么也没有。

此外,我可以从 fetchedREsultsController 中获取其他对象,而不是我已经访问过的对象。

例如,我可以获得 [fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] 并在下一个视图中显示它。

当我回击并返回我的父视图时,我可以在 indexPathForRow:0 inSection:1 处获取对象并显示它。

再次回到开头,我尝试让 indexPathForRow:0 inSection:0 崩溃并出现 EXC_BAD_ACCESS。

在有 100 行的表中,我可以获取每一行一次,但是任何两次获取同一行的尝试都会崩溃,即使这些尝试是一个接一个。

4

4 回答 4

1

我对 NSFetchedResultsController 有这个确切的问题。我通过在 Xcode 中打开 NSZombieEnabled解决了这个问题。就我而言,事实证明我过度释放了 NSFetchedResultsController。

我第一次加载数据时它起作用了,但后来我在没有意识到的情况下释放它。下一次,我发布了我已经发布的同一个实例,它会崩溃。

如果您仍然有问题,请发布您的 NSFetchedResultsController 初始化代码。

于 2010-01-19T22:55:26.210 回答
0

听起来当您返回时,列表实际上已被破坏,并且指针不再引用有效的内存地址。你有什么东西可以处理清单吗?

于 2010-01-19T20:56:47.400 回答
0

您是否实施了以下方法?

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    // In the simplest, most efficient, case, reload the table view.
    //[self.tableView reloadData];
}

也许在那里放一个断点,看看内容是否正在改变?鉴于 NSFetchResultsController 的谈话,我认为您可能处于一个可以提供帮助的场景中。

于 2010-01-19T22:07:18.967 回答
0

我终于找到了这个问题的答案!

在我的 dealloc 部分中,我解除了许多变量的分配而不是释放它们。现在我已经将这些更改为发布,一切都按预期工作。

于 2010-02-14T18:03:39.050 回答