删除行时的 EXC_BAD_ACCESS(代码=EXC_I386_GPFLT)(在:[IndexPath])
Posted
技术标签:
【中文标题】删除行时的 EXC_BAD_ACCESS(代码=EXC_I386_GPFLT)(在:[IndexPath])【英文标题】:EXC_BAD_ACCESS (code=EXC_I386_GPFLT) when deleteRows(at: [IndexPath]) 【发布时间】:2018-08-31 12:24:19 【问题描述】:我正在开发一个在主屏幕上有一个主表格视图的应用程序。当我点击表格视图的某种类型的单元格时,我会做一些动画,然后删除该单元格。我在所有模拟器上尝试了这种行为。仅在 4,7" 和 5,5" 上,当我尝试系统地删除某一行时,我会崩溃。我无法理解错误,因为 Xcode 只说:EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
这是我的代码:
tableView.deselectRow(at: indexPath, animated: false)
let incomingReminderTableViewCell = cell as! IncomingReminderTableViewCell
self.tableView.isUserInteractionEnabled = false
incomingReminderTableViewCell.completeReminderAt(indexPath: indexPath) (indexPath) in
let selectedReminder = self.incomingReminders.reversed()[indexPath.row-1]
if CoreDataManager.sharedInstance.delete(selectedReminder)
UserNotificationManager.decreaseBadge()
UserNotificationManager.deleteNotificationsWith(identifiers: [selectedReminder.idNotification])
self.incomingReminders = self.incomingReminders.reversed()
self.incomingReminders.remove(at: indexPath.row-1)
self.incomingReminders = self.incomingReminders.reversed()
if self.incomingReminders.isEmpty
UIView.animate(withDuration: 0.2, animations:
incomingReminderTableViewCell.alpha = 0.0
, completion: (disappeared) in
self.tableView.reloadRows(at: [indexPath], with: .fade )
self.tableView.isUserInteractionEnabled = true
)
else
UIView.animate(withDuration: 0.2, animations:
incomingReminderTableViewCell.alpha = 0.0
, completion: (disappeared) in
self.tableView.isUserInteractionEnabled = true
self.tableView.deleteRows(at: [indexPath], with: .right) // HERE THE CRASH
self.incomingReminders = CoreDataManager.sharedInstance.getIncomingReminders()
if self.incomingReminders.count == 5
Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false, block: (timer) in
self.tableView.insertRows(at: [IndexPath(row: self.incomingReminders.count, section: 0)], with: .fade)
timer.invalidate()
)
)
else
self.tableView.isUserInteractionEnabled = true
当应用程序崩溃时,我有 indexPath = (row: 3, section: 0),没错。 DataSource 已正确更新,在 deleteRows 之前我在数组中有两个元素,tableview 中的数据从 indexPath = (row: 1, section: 0) 开始。找不到解决办法。
【问题讨论】:
请在该行放置一个断点/在调用之前打印对象并确保您的“tableView”实际上是一个 UITableView 我做到了,没关系。但我发现了别的东西:如果我在让它崩溃之前滚动一点表视图,就不会发生崩溃。我在调试中启用了 Zombies 对象,并在控制台中收到此消息:-[UIImageView retain]: message sent to deallocated instance 0x7ffbb0918c70。我认为是单元格重用的问题:我指向单元格(imageview)的一个元素,该元素已被释放,因为它的行不再存在。但是我不知道如何解决它......在更新dataSource之后调用tableView.deleteRows来更新tableView还不够吗? 【参考方案1】:不是很相信,但我是这样解决的:
tableView.performBatchUpdates(
tableView.deleteRows(at: [indexPath], with: .right)
, completion: (deleted) in
tableView.reloadData()
self.tableView.isUserInteractionEnabled = true
self.incomingReminders = CoreDataManager.sharedInstance.getIncomingReminders()
if self.incomingReminders.count == 5
Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false, block: (timer) in
self.tableView.beginUpdates()
self.tableView.insertRows(at: [IndexPath(row: self.incomingReminders.count, section: 0)], with: .fade)
self.tableView.endUpdates()
timer.invalidate()
)
)
问题是在tableview中删除了一定数量的行后,它仍然很脏。其实删除一堆行,滚动,然后继续删除,crash并没有发生。我需要重新加载数据。我放了
tableView.deleteRows(at: [indexPath], with: .right)
作为批量更新。在完成块中,我用其他东西调用了重新加载。目前一切似乎都还好。希望这对某人有用。
【讨论】:
以上是关于删除行时的 EXC_BAD_ACCESS(代码=EXC_I386_GPFLT)(在:[IndexPath])的主要内容,如果未能解决你的问题,请参考以下文章
更改 nsdictionary 中的布尔值时的 EXC_BAD_ACCESS
删除行时TableView“无法识别的选择器发送到实例”错误
Swift EXC_BAD_ACCESS,在协议扩展中定义了默认实现
删除行时如何使多行TextInput缩小(React-Native)?
当我在 iPad 上运行时,我的游戏一直在说“EXC_BAD_ACCESS(code=1, address=0xb176e978)”