博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS性能调优系列:使用Zombies动态分析内存中的僵尸对象
阅读量:5917 次
发布时间:2019-06-19

本文共 1633 字,大约阅读时间需要 5 分钟。

硬广:《IOS性能调优系列》第四篇,预计会有二十多篇,持续更新,欢迎关注。

前两篇《》、《》关注了内存泄露的问题,本篇正好相反,关注的是内存中那些被过度释放的对象(overreleased objects)。

这篇的标题纠结了半天,到底是写EXC_BAD_ACCESS错误调试,还是写内存中僵尸对象的分析,最后还是选了个Duang~Duang~的标题。

今天在论坛上看到个帖子,遇到的就是本篇要分析的问题,正好拿来解释Bug场景:

相信在使用ARC之前,很多人遇到过EXC_BAD_ACCESS错误,这个错误可以理解为访问了已被释放的对象,苹果称之为僵尸对象。

比如在不开启ARC下,下面这段代码:

NSString* hello = [NSString stringWithFormat:@"Hello"]; NSLog(@"What you say is %@",hello);  [hello release];

hello对象不是手动分配,而是加入到自动释放池,由释放池负责释放,所以第三行调用release时就会产生EXC_BAD_ACCESS错误。

在开启ARC后,可以很大程度上避免产生EXC_BAD_ACCESS错误,但也是有出现可能的,比如IOS里使用了C++代码,C++部分的对象是不会有ARC来管理的。

EXC_BAD_ACCESS错误不像访问空指针一样容易定位,往往报错时很难查找到错误点,所以XCode在Instruments中提供了单独的Zombies工具来分析这类错误。

使用Zombies分析的原理


 

和使用 Instruments的其他工具一样,点击XCode的Product菜单Profile启动Instruments:

可以看到Zombies工具下边的介绍,用于查找那些被过度释放的僵尸对象。

Zombies工具的查找原理其实和设置NSZombieEnabled环境变量的调试方式是一样的,启动Zombies后在内部设置了NSZombieEnabled为True。

启用了NSZombieEnabled的话,它会用一个僵尸来替换默认的dealloc实现,也就是在引用计数降到0时,该僵尸实现会将该对象转换成僵尸对象。僵尸对象的作用是在你向它发送消息时,就不会向之前那样Crash或者产生 一个难以理解的行为,而是放出一个错误消息,它会显示一段日志并自动跳入调试器, 因此我们就可以找到具体或者大概是哪个对象被错误的释放了。

使用Zombies分析的步骤


 

1、启动Instruments,选择Zombies;

2、对之前产生EXC_BAD_ACCESS的测试用例重新运行,直到程序崩溃,如果发生EXC_BAD_ACCESS错误,会出现以下界面:

3、通过滑动箭头来查看错误细节,例如可以看到该对象的内存操作过程,如malloc、autorelease、retain、release等操作;

4、查看底部的详细历史,选择相应的行可以定位到相应的代码,找出产生错误的代码:

基本上通过查看Zombies工具给出的信息找出错误代码行是比较简单的,Zombies也只有在产生EXC_BAD_ACCESS错误时才有用。

手动设置NSZombieEnabled环境变量:


 

XCode也提供了手动设置NSZombieEnabled环境变量的方法,不过设置NSZombieEnabled为True后,会导致内存占用的增长,同时会影响Leaks工具的调试,这是因为设置NSZombieEnabled会用僵尸对象来代替已释放对象。

点击Product菜单Edit Scheme打开该页面,然后勾选Enable Zombie Objects 复选框:

一般不建议进行进行手动设置,而应该使用Zombies工具进行调试。


 

记录,为更好的自己!转载请注明出处!

转载于:https://www.cnblogs.com/ym123/p/4319185.html

你可能感兴趣的文章
把 MapXtreme for Java 迁移到 Tomcat 5.5 上
查看>>
Java中log4j控制写入日志开关
查看>>
DWR+freemarker+commons.mail 实现模板定制动态邮件发送
查看>>
科普系列之-让你的本本使用WLAN
查看>>
Liferay 如何加入自定义的js库文件
查看>>
LYNC2010 标准版的安装
查看>>
PD设计中表名过长,自动生成的主外键名截取的问题
查看>>
Microsoft Dynamics CRM 2013 电子邮件路由器安装程序 介绍
查看>>
Android:数据库增删改查、SQLite、SQLiteOpenHelper、openOrCreateDatabase
查看>>
007 content for
查看>>
使用spring boot devtools不要多此一举加try...catch
查看>>
[奇思怪想]浏览器插件之静音盒子
查看>>
性能监控之日志监控部分
查看>>
前端重构实践(二) —— 模块化开发
查看>>
ssh 与 locale
查看>>
聋哑人网络店铺的一天,催人泪下啊
查看>>
个人专著推荐2:Linux安全技术内幕
查看>>
《统一沟通-微软-技巧》-16-升级-反向代理服务器
查看>>
Java多线程初学者指南(11):使用Synchronized块同步方法
查看>>
Hyper-V 3.0功能部署PART 3:部署SMB共享存储
查看>>