应用程序在第二次选择同一行时崩溃
Posted
技术标签:
【中文标题】应用程序在第二次选择同一行时崩溃【英文标题】:Application crashes on second select of same row 【发布时间】:2010-01-19 20:01:00 【问题描述】:我正在使用的 iPhone 核心数据应用程序遇到问题。我有一个列出对象的表。如果我选择其中一个对象,我会转到一个显示该对象详细信息的新 ViewController。
在详细视图中,我有一个返回按钮,可将我带回到主列表视图。
我可以选择任意数量的行,它会显示每个行的详细视图。但是,如果我尝试选择我已经选择的行,它会崩溃
节目接收信号: “EXC_BAD_ACCESS”。
我添加了一些断点并试图追踪它,并在我的 tableView cellForRowAtIndexPath 方法中找到以下内容...
当我第一次通过每个对象时 MyEntity *thingamy = [fetchedResultsController objectAtIndexPath:indexPath] thingamy 有效并设置为有效的thingamy。在 gdb 中,我可以在此时设置断点并执行
pothingamy 我得到了预期的输出。
但是,当我第二次选择特定行时(例如,选择第 0 行,返回,再次选择第 0 行),thingamy 设置不正确。
我可以查看任意数量的其他行,但是当我尝试选择一行时,我已经查看了该行的详细信息。
如果我设置了断点,并且在设置断点后尝试执行 po thingamy,我会得到以下信息:
程序接收到信号EXC_BAD_ACCESS,无法访问内存。 原因:KERN_PROTECTION_FAILURE 地址:0x00000020 objc_msgSend()中的0x92ca3ed7
知道为什么 fetchedResultsController 在第一次调用时返回一个有效对象,而第二次则没有?
更新
现在几天后,我确信 fetchedResultsController 被解除分配不是问题。我启用了 NSZombieEnabled 模式,但那里什么都没有。
此外,我可以从 fetchedREsultsController 中获取其他对象,而不是我已经访问过的对象。
例如,我可以得到 [fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] 并在我的下一个视图中显示。
当我回击并返回到我的父视图时,我可以在 indexPathForRow:0 inSection:1 处获取对象并显示它。
再次回到开头,我尝试在Section:0 中获取 indexPathForRow:0,但它因 EXC_BAD_ACCESS 而崩溃。
在一个有 100 行的表中,我可以获取每一行一次,但任何两次获取同一行的尝试都会崩溃,即使这些尝试是一个接一个。
【问题讨论】:
【参考方案1】:NSFetchedResultsController 确实存在这个问题。我通过turning on NSZombieEnabled in Xcode 解决了它。就我而言,事实证明我过度释放了 NSFetchedResultsController。
我第一次加载数据时它起作用了,但后来我在没有意识到的情况下释放它。下一次,我发布了我已经发布的同一个实例,它会崩溃。
如果您仍然遇到问题,请发布您的 NSFetchedResultsController 初始化代码。
【讨论】:
【参考方案2】:听起来,当您返回时,列表实际上已被销毁,并且指针不再引用有效的内存地址。你有什么可以处理列表的吗?
【讨论】:
我没有处理列表的任何东西——它不是真正的列表,它是 NSFetchedResultsController 的一个实例。它仍然有效,因为我可以获得任何其他行,只是不是我已经选择的行。【参考方案3】:你实现了以下方法吗?
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
// In the simplest, most efficient, case, reload the table view.
//[self.tableView reloadData];
也许在里面放一个断点,看看内容是否发生变化?鉴于 NSFetchResultsController 的谈话,我认为您可能处于一个可以提供帮助的场景中。
【讨论】:
是的,我确实包含了它,但是查看断点,它永远不会被调用。【参考方案4】:我终于找到了答案!
在我的 dealloc 部分中,我解除了许多变量的分配而不是释放它们。现在我已将这些更改为发布,一切都按预期工作。
【讨论】:
以上是关于应用程序在第二次选择同一行时崩溃的主要内容,如果未能解决你的问题,请参考以下文章
UIImagePickerController 在第二次取消时崩溃
NSConstraints 在第二次加载 UIView 后崩溃应用程序
cordova/phonegap 1.6 在第二次发布时崩溃
NSString 到 C 风格的 char 数组在第二次调用 drawRect 时崩溃