message sent to deallocated instance 的解决办法

 iOS开发,最郁闷的莫过于程序毫无征兆地就崩溃了,用bt命令打出调用栈,给出的是一堆系统EXC_BAD_ACCESS的信息,根本没办法定位问题出现在哪里。通常这样的崩溃出现,原因一般就是:调用了已经释放的内存空间,或者说重复释放了某个地址空间。而怎样定位到这个地址呢,可以通过编辑xcode的scheme,添加如下标记位,让系统把错误地址打印出来。

通过Product-> Scheme-> Edit Scheme 进入下面编辑页面,选中Arguments,增加标记位NSZombieEnabled并设为YES。

方法2:Product->按住alt/option+鼠标点Run...,之后同上。

设置NSZombieEnabled有什么用呢?是为了方便定位向已释放的instance发送消息后crash的位置。当设置NSZombieEnabled为YES后,运行程序,此时程序不再crash,而是在向已释放对象发送消息的位置断住,并在调试器中打印引起异常对象的消息。

注意:因启动NSZombie后,本应释放的内存变成了NSZombie而不被释放,会使程序占用的内存越来越多,所以只能在调试时设置NSZombieEnabled环境变量,在发布时要去除。

如果崩溃不在当前调用栈,系统就仅仅只能把崩溃地址告诉我们,而没办法定位到具体代码,这样我们也没法去修改错误。这时我们可以添加MallocStackLoggingNoCompact,并且设置为YES。

这样当出现崩溃原因是message sent to deallocated instance 0x717910 我们可以使用以下命令,把内存地址还原:

info malloc-history 0x717910

需要注意的是:这个命令只支持gdb,所以必须把控制台的输出改成gdb,并且只支持模拟器,不支持真机调试。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值