iOS精英班IOS文章收集理论

iOS实录15:浅谈iOS Crash(二)

2017-07-12  本文已影响1714人  南华coder

[这是第15篇]

导语:在当前的iOS开发中,虽然ARC为开发者解决了手动内存管理时代 的许多麻烦,但是内存方面的问题依然是产生iOS Crash的元凶之一,本文介绍内存方面,有关僵尸对象、野指针、内存泄漏、废弃内存这四类问题的调试方法和代码中的注意事项。

一、僵尸对象(Zombie Objects)

1、概述
2、使用NSZombieEnabled
设置NSZombieEnabled.png 设置NSZombieEnabled和MallocStackLoggingNoCompact.png bt效果.png

说明:发版前要将僵尸对象检测这些设置都去掉,否则每次通过指针访问对象时,都去检查指针指向的对象是否为僵尸对象,这就影响效率了。

3、代码中的注意事项

在ARC时代,避免访问释放掉的内存,代码需要注意的地方有:

建议: 注意CF对象的创建和释放。

二、野指针(Wild pointer)

1、概述
访问野指针可能发生的情况图.png
2、设置Malloc Scribble
设置Malloc Scribble.png

说明:该方法必须连接Xcode运行代码才发现,不适合测试人员使用。可以基于fishhook ,选择hook对象释放的接口(C的free函数),达到和设置Enable Scribble一样的效果。详情参考如何定位Obj-C野指针随机Crash(一):先提高野指针Crash率如何定位Obj-C野指针随机Crash(二):让非必现Crash变成必现如何定位Obj-C野指针随机Crash(三):加点黑科技让Crash自报家门

3、代码中的注意事项

检查使用assgin或 unsafe_unretained 修饰指向OC对象的指针 和 Core Foundation等底层操作。

三、内存泄漏(Memory Leak)

1、概述
2-1、排查之静态分析(Analyzer)

说明: Analyzer由于是编译器根据代码进行的判断, 做出的判断不一定会准确, 因此如果遇到提示, 应该去结合代码上文检查一下;还有某些造成内存泄漏的循环引用通过Analyzer分析不出来。

2-2、排查之内存泄漏工具(Leaks)
Leaks调试界面.png
Call Tree 中选项 说明
Separate by Category 按类型分类,展开All Heap Allocations这一套显示的就是不同方法里堆内存的分配情况
Separate by Thread 按线程分开做分析,这样更容易揪出那些吃资源的问题线程。特别是对于主线程,它要处理和渲染所有的接口数据,一旦受到阻塞,程序必然卡顿或停止响应。
Invert Call Tree 反向输出调用树。把调用层级最深的方法显示在最上面,更容易找到最耗时的操作。
Hide System Libraries 隐藏系统库文件。过滤掉各种系统调用,只显示自己的代码调用。
Flattern Recursion 拼合递归。将同一递归函数产生的多条堆栈(因为递归函数会调用自己)合并为一条
2-3、排查之MLeaksFinder(强烈推荐)

MLeaksFinder是微信阅读团队为了简化内存泄漏排查工作,推出的第三方工具,也是我们当前项目中内存泄漏的工具之一。

说明:详细内容请参考:MLeaksFinder:精准 iOS 内存泄露检测工具MLeaksFinder 新特性

3、代码中的注意事项(ARC下的循环引用是内存泄漏的主要原因)

四、废弃内存(Abandoned Memory)

1、概述#####
2、使用Allocation
Allocation界面Statistics Detail 下显示.png
Detail列名 说明
Graph 类型的选择项
Category 类型,或CF对象,或OC对象,或原始块的内存
Persistent Bytes 未释放的内存和大小
Persistent 未释放的对象个数
Transient 已经释放的对象个数
Total Bytes 总使用内存大小
Total 总使用对象个数
Transient / Total Bytes 已释放内存大小/总使用内存大小
Allocation Type 说明
All Heap & Anonymous 所有堆内存和其他内存
All Heap Allocations 所有堆内存
All Anonymous VM 所有其他内存
Allocation界面Call Tree下显示.png
Call Tree列名 说明
Bytes Used 已经使用的内存大小
Count 符号使用的总个数
Symbol Name 符号名称

说明:这些名词的具体解释见Instrument-Allocations

Allocation界面Mark Generation下显示.png
3、代码中的注意事项

略,与内存泄漏部分代码中的注意事项相同。

End####

上一篇下一篇

猜你喜欢

热点阅读