crash场景描述
页面1 push 到页面2,页面2使用UITableView展示一个列表,cell左滑可以显示删除按钮。如果在显示“删除”按钮的时候,不点击“删除”按钮。直接点击返回按钮,程序就会crash。debug模式下如下:
exc_bad_access(code=1,address=0x...)
这什么鬼嘛,内存泄露?
解决过程
上网找了一番,找到可以定位到出错的代码的方式:
(http://www.cnblogs.com/16zj/p/5026776.html)。
具体方式就是:
在Xcode中:Product->Scheme->Edit Scheme->Run->Diagnostics->Memory Management->Zombie Objects(勾选)
如下:
此时再次重现场景,会发现打印出“僵尸对象”的具体位置了:
[DataArraySource tableView:canEditRowAtIndexPath:]: message sent to deallocated instance 0x162e4e20
由此果然证明这是由于 UITableViewCell 的“删除”按钮显示,而返回上个页面会引起crash。(由于有多个页面类似,有些地方则不会引起这个crash,我猜测是iOS系统本身的问题。)
解决方式
于是继续搜索下,发现别人也遇到同样的问题:
(http://stackoverflow.com/questions/19230446/tableviewcaneditrowatindexpath-crash-when-popping-viewcontroller)
果然,解决方式就是在UIViewController中加入如下代码即可:
-(void)dealloc{
[self.tableView setEditing:NO];
}