zoukankan      html  css  js  c++  java
  • 用NSZombieEnabled解决恼人的EXC_BAD_ACCESS错误

    按住Option点Run按钮,在出现的窗口中选择Arguments,在Environment Variables里面添加NSZombieEnabled,Value下面添YES

    以下为XCode 3的设置方法

    这个方法也许很多人都知道了,但是毕竟有不知道的,比如在写这篇文章之前10分钟的我。先说明情况:昨天遇到了这样的问题,程序突然Crash,出现EXC_BAD_ACCESS错误,但是不是每次都Crash,有几次RP高了就好使,Debug时最终基本停在objc-msgsend这里,但也不是每次,是大部分(90%)。十分令人费解,搞了几个小时无果,求助google和stackoverflow终于解决。

    首先解释下EXC_BAD_ACCESS,当你向已经释放的对象发送消息时就会出现这种错误。

    至于NSZombieEnabled,就是当设置NSZombieEnabled环境变量后,一个对象销毁时会被转化为_NSZombie,个人感觉和线程的那几个状态有些相似,设置NSZombieEnabled后,当你向一个已经释放的对象发送消息,这个对象就不会向之前那样Crash或者产生一个难以理解的行为,而是放出一个错误消息,然后以一种可预测的可以产生debug断点的方式消失(原文是die),因此我们就可以找到具体或者大概是哪个对象被错误的释放了。

    设置NSZombieEnabled的方法如下

    1. 在XCode左边那个Groups & Files栏中找到Executables,双击其中的一项,或者右键Get Info;
    2. 切换到Arguments
    3. 这里一共有两个框,在下面那个Variables to be set in the environment:点+号添加一项,Name里填NSZombieEnabled,Value填Yes,要保证前面的钩是选中的。

    好了,赶紧去找哪里出了问题吧,至于取消NSZombieEnabled,就是吧刚才提到的那个钩取消即可。

    最后总结一下感想,首先是我对EXC_BAD_ACCESS这个错误还没有足够的认识,其次是我没有尽快的去搜索一下解决方法,这两点导致我浪费了大量时间做各种各样奇怪的调试。幸好现在解决了,可以继续工作了。

    2012.02.15更新:

    在debug过程中,你可能发现启用NSZombieEnabled后,程序不再crash,而一旦去掉NSZombieEnabled,程序再次crash。此时NSZombieEnabled已经无法解决你的问题,只能遵照内存管理原则仔细查找问题出处,至于这种问题的产生原因,个人认为可能是NSZombieEnabled在一定程度上延长了一个object的生命周期,而延长的这段时间恰好突破了EXC_BAD_ACCESS的临界点,从而避免了EXC_BAD_ACCESS的发生。

    十年日记 iPhone、iPad、Android、Web http://www.10riji.com
  • 相关阅读:
    HDU4529 郑厂长系列故事——N骑士问题 —— 状压DP
    POJ1185 炮兵阵地 —— 状压DP
    BZOJ1415 聪聪和可可 —— 期望 记忆化搜索
    TopCoder SRM420 Div1 RedIsGood —— 期望
    LightOJ
    LightOJ
    后缀数组小结
    URAL
    POJ3581 Sequence —— 后缀数组
    hdu 5269 ZYB loves Xor I
  • 原文地址:https://www.cnblogs.com/iguor/p/2696856.html
Copyright © 2011-2022 走看看