美文网首页
exc_bad_access(code=1, address=0

exc_bad_access(code=1, address=0

作者: 代码干货 | 来源:发表于2015-09-08 22:46 被阅读256次

    错误原因:
    exc_bad_access(code=1, address=0x789870)野指针错误,主要的原因是,当某个对象被完全释放,也就是retainCount,引用计数为0后。再去通过该对象去调用其它的方法就会出现野指针错误。
    <pre>
    例如:
    Person *jerry = [[Person alloc]init]; // retainCount引用计数为1
    [jerry eat]; // 调用吃的方法
    [jerry release]; // 释放jerry这个对象到 retainCount引用计数为0

    // 此时如果继续引用jerry这个对象就会出现野指针错误,exc_bad_access
    [jerry sleep];
    </pre>

    解决方法:
    首先得定位到哪里出现的这样野指针引用错误,如果是大型的项目代码量一大,找起来是非常痛苦的。
    IOS提供了一个环境变量设置来帮忙定位错误位置的信息描述:NSZombieEnabled ,就是当设置NSZombieEnabled环境变量后,一个对象销毁时会被转化为_NSZombie,设置NSZombieEnabled后,当你向一个已经释放的对象发送消息,这个对象就不会向之前那样Crash或者产生一个难以理解的行为,而是放出一个错误消息,然后以一种可预测的可以产生debug断点的方式消失, 因此我们就可以找到具体或者大概是哪个对象被错误的释放了。
    例如会出现这样的提示:
    [jerry sleep]:message sent to deallocated instance 0x78d7ed0
    设置NSZombieEnabled环境变量,XCode4中:

    你可以点击 Xcode 菜单 Product -> Edit Scheme-> Arguments, 然后将点击”加号”, 将 NSZombieEnabled 参数加到Environment Variables 窗口中, 后面的数值写上 ”YES”.

    或者在 Xcode 菜单 Product -> EditScheme -> Diagnostics 设置窗口中直接勾上Enable ZombieObjects 即可,Xcode 可用 cmd+shift+< 进到这个窗口。


    之后可能会出现如下提示:
    iOS crash: respondsToSelector: message sent to deallocated instance
    解决方案:
    在dealloc 的时候将需要的delegate 置空
    -(void)dealloc{
    委托者.delegate = nil;

    }
    参考如下:
    iOS crash: respondsToSelector: message sent to deallocated instance

    相关文章

      网友评论

          本文标题:exc_bad_access(code=1, address=0

          本文链接:https://www.haomeiwen.com/subject/zlqpcttx.html