iOS性能测试实战篇(二)

发表于:2017-12-27 11:47

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Fly晴天里Fly    来源:51Testing软件测试网采编

  内存
  可分为静态分析和动态分析。
  l 静态分析
  Analyze
  l 动态分析
  Leaks
  Activity Monitor
  Allocations
  Zombies
  2.1静态分析-Analyze编译
  在 xcode中长按运行按钮>Analyze,可启动代码静态分析。
  图24
  图25
  图26
  对于MRC(MannulReference Counting)项目,静态分析是必要的,对于ARC(Automatic Reference Counting) 项目,静态分析作为可选项。这项检查只覆盖代码编译时可能存在的问题,但并不能覆盖代码运行时。这时,我们还需要结合动态分析工具。
  Analyze主要分析以下四种问题:
  A. 逻辑错误:访问空指针或未初始化的变量等;
  B. 内存管理错误:如内存泄漏等;
  C. 声明错误:从未使用过的变量;
  D. Api调用错误:未包含使用的库和框架。
  2.2 动态分析内存工具
  l Leaks
  l Activity Monitor
  l Allocations
  l Zombies
  2.2.1 内存泄漏分析工具-Leaks
  profiler 你的app不再赘述。
  图27
  A.红色箭头处,这种红色X的地方就是内存泄露的地方;
  B.接下来就可以进行内存泄露定位工作了,首先我们得找到上图有个“田”样式的图案把那个Statictics改成Call Trees你就可以看到 其右侧有一个“齿轮形状”的设置按钮。
  图28
  一般选中我所打箭头的两个 就可以清晰地看到,内存泄露的定位
  图29
  上图其实不是内存泄漏,是底层的。
  2.2.2 活动监视器-Activity Monitor
  图30
  执行操作(进入一个页面退出后)->筛选你的app,Real Mem如果不减退,则出现内存泄漏。
  2.2.3 不合理内存分析工具-Allocations
  关于内存的问题,除了内存泄漏以外,还可能存在内存不合理使用的情况,也会导致IOS内存警告。
  内存的不合理使用往往比内存泄漏更难发现,内存泄漏可以更多借助于工具的判断,而内存的不合理运用更多需要开发者结合代码、架构来进行分析。
  明确说明一下两者的区别:
  内存泄漏:是指内存被分配了,但程序中已经没有指向该内存的指针,导致该内存无法被释放,产生内存泄漏。
  内存不合理运用:苹果官方称这种情况为Abandoned Memory,也就是存在已分配内存的引用,但实际上程序中不会使用,比如图片等对象加入了缓存,但缓存中的对象一直没有被使用。
       XCode提供的Instruments中的Allocation工具可以用来帮你了解内存的分配情况,当你的App收到内存警告时,首先应该用Allocation进行内存分析,了解哪些对象占x用了太多内存。
  2.2.4 干掉僵尸对象–Zombies
  僵尸对象,也就是我们会遇到的EXC_BAD_ACCESS错误,由于内存已经被释放,而这个对象仍旧保留这那个坏地址而导致的。
  比如在不开启ARC下,下面这段代码:
  NSString* hello = [NSString stringWithFormat:@"Hello"];
  NSLog(@"What you say is %@",hello);
  [hello release];
  将其添加到贴吧视频tab:
  图31
  hello对象不是手动分配,而是加入到自动释放池,由释放池负责释放,所以第三行调用release时就会产生EXC_BAD_ACCESS错误。
  图32
  贴吧页面展示为:
  图33
  即崩溃了。
  在开启ARC后,可以很大程度上避免产生EXC_BAD_ACCESS错误,但也是有出现可能的,比如IOS里使用了C++代码,C++部分的对象是不会有ARC来管理的。
  EXC_BAD_ACCESS错误不像访问空指针一样容易定位,往往报错时很难查找到错误点,所以XCode在Instruments中提供了单独的Zombies工具来分析这类错误。
  2.2.4.1 手动设置NSZombieEnabled环境变量
  Zombies工具的查找原理其实和设置NSZombieEnabled环境变量的调试方式是一样的,启动Zombies后在内部设置了NSZombieEnabled为True。
  启用了NSZombieEnabled的话,它会用一个僵尸来替换默认的dealloc实现,也就是在引用计数降到0时,该僵尸实现会将该对象转换成僵尸对象。僵尸对象的作用是在你向它发送消息时,就不会向之前那样Crash或者产生 一个难以理解的行为,而是放出一个错误消息,它会显示一段日志并自动跳入调试器, 因此我们就可以找到具体或者大概是哪个对象被错误的释放了。
  步骤:
  图34
  进行编译,如果出现僵尸对象,工程会崩掉。但一般不建议进行进行手动设置,而应该使用Zombies工具进行调试。
  言归正传,Zombies这个工具比较简单,遇到上述那类错误,打开这个位于Instruments下的工具,直接就能帮你定位到。
  2.2.4.2 Zombies****分析
  使用Zombies分析的步骤:
  A. 启动Instruments,选择Zombies;
  B. 对之前产生EXC_BAD_ACCESS的测试用例重新运行,直到程序崩溃,如果发生EXC_BAD_ACCESS错误,会出现以下界面:
  C. 通过滑动箭头来查看错误细节,例如可以看到该对象的内存操作过程,如malloc、autorelease、retain、release等操作;
  D. 查看底部的详细历史,选择相应的行可以定位到相应的代码,找出产生错误的代码:
  基本上通过查看Zombies工具给出的信息找出错误代码行是比较简单的,Zombies也只有在产生EXC_BAD_ACCESS错误时才有用。

相关文章: iOS性能测试实战篇(一)

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号