当前位置: 移动技术网 > IT编程>移动开发>IOS > IOS开发(46)之设置 NSZombieEnabled 定位 EXC_BAD_ACCESS 错误

IOS开发(46)之设置 NSZombieEnabled 定位 EXC_BAD_ACCESS 错误

2019年05月12日  | 移动技术网IT编程  | 我要评论

盛世重光,杜桥,鸠江区人民政府

我们做 ios 时经常用遇到 exc_bad_access 错误导致 crash,出现这种错误时一般 xcode 不会给我们太多的信息来定位错误来源,只是在应用 delegate 上留下像 thread 1: program received signal: "exc_bad_access" ,让问题无从找起。

比如你对已释放的对象发送消息时就会出现,exc_bad_access,再如 release 的对象再 release,release 那些 autorelease 的对象等也会报这样的错。默认设置下 xcode 不会给你定位具体是哪一行代码,不该去使用已释放的对象,或者 release 用错了。

比如 uiviewcontroller 子类中这样的代码:

static nsmutablearray *array;

- (void)viewdidload
{
    [super viewdidload];
    array = [[nsmutablearray alloc] initwithcapacity:5];
    [array release];
}

- (void) viewwillappear:(bool)animated {  
    [array addobject:@"hello"];
}上面的代码就会出现 exc_bad_access 错误,但我执行时 xcode 一出错却是定位在我 在 appdelegate 的 application:didfinishlaunchingwithoptions: 方法上的某行了,如果代码量 多了,要查找具体问题非常难,但凭经验了。

不过 nszombieenabled 环境变量可以帮我们的忙,就是当设置nszombieenabled环境变量后,一个对象销毁时会被转化为 _nszombie,设置nszombieenabled后,当你向一个已经释放的对象发送消息,这个对象就不会向之前那样crash或者产生 一个难以理解的行为,而是放出一个错误消息,然后以一种可预测的可以产生debug断点的方式消失, 因此我们就可以找到具体或者大概是哪 个对象被错误的释放了。

对 xcode 设置了 nszombieenabled 之后,xcode 会明确定位在行 [array addobject:@"hello"],然后控制台下报的错误信息是:

*** -[__nsarraym addobject:]: message sent to deallocated instance 0x6557370

如何设置 nszombieenabled 呢,在 xcode3 和 xcode4 下设置不一样,xcode4 下设置很简单。
xcode3 下 nszombieenabled 设置方法如下:

1.   在xcode左边那个groups & files栏中找到executables,双击其中的一项,或者右键get info;
2.  切换到arguments
3.  这里一共有两个框,在下面那个variables to be set in the environment:点+号添加一项,name里填nszombieenabled,value填yes,要保证前面的钩是选中的。

xcode4 下设置 nszombieenabled 的方法:

你可以点击 xcode4 菜单 product -> edit scheme -> arguments, 然后将点击”加号”, 将 nszombieenabled 参数加到 environment variables 窗口中, 后面的数值写上 ”yes”.

或者在 xcode4 菜单 product -> edit scheme -> diagnostics 设置窗口中直接勾上 enable zombie objects 即可,xcode 可用 cmd+shift+< 进到这个窗口。

 

xcode4 已经考虑到了现在的要求,所以提供了更便捷的设置的方式,你也可以在这个窗口中设置其他一些参数,你肯定能由此获得更多的帮助信息。

另外再说一下,如果没有为 xcode 设置 nszombieenable,像下面的代码或许可以正确执行,打印出你所期望的结果 “hello”

static nsmutablearray *array;

- (void)viewdidload
{
    [super viewdidload];
    array = [[nsmutablearray alloc] initwithcapacity:5];
    [array release];
    [array addobject:@"hello"];
    nslog(@"%@", [array objectatindex:0]);
}但是一旦加上了 nszombieenable 设置,上面的代码行  [array addobject:@"hello"] 也将无法投机取巧了,同样会得到错误提示:

*** -[__nsarraym addobject:]: message sent to deallocated instance 0x6557370

即使该 array 所指向的内存还是原来的数据也不能逃脱掉 nszombieenable 的法眼。也就是之所以未设置 nszombieenable 时上 面代码能得到正确结果,是因为,虽然 [array release] 是标记为释放掉该内存块,但是后面使用 array 时,因为该指针指向的内存数据未被覆盖,所以未出错,这和 c++ 的指针 delete 后的效果是一样的。

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

  • ios uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网