启动性能分析
Mach-o
Mach-o文件的类型:
Mach的结构
1:Header
2:Load Commands
3:data
新建项目,在ViewController里面实现+load方法,打断点,在main里面打断点。发现先走的是+load方法,断点前有很多栈信息 其中有_dyld_start
分析dyld,dyld是什么?
dyld -> dynamic loader 动态加载器
当系统吧dyld加到App进程后dyld的操作过程:
dyld -> load dylibs -> rebase -> bind -> Objc -> 其他初始化
优化之前要测量一下启动时间
-
main函数之前的消耗时间的测量:添加一个环境变量就可以在控制台将这个时间的数据打印出来。
动态库对App启动时间影响的实测
http://www.cocoachina.com/ios/20161125/18179.html
-
main函数之后的测量:
利用CFAbsoluteTimeGetCurrent() 获取时间
可以得到main之后的时间
启动时间优化的方向:
- 耗时操作要进行异步处理
- loading的广告要做缓存
- 减少root页面viewdidload和viewwillappear里面的操作
- 未使用的动态库及时清理掉
内存优化
如何检测内存方面的问题?
遇到EXC_BAD_ACCESS崩溃的时候,一般就是出现野指针的时候。我们开启僵尸对象检测就可以找到僵尸对象。
开启步骤:Product->Scheme->Edit Scheme->Diagnostics->勾选Zombie Objects
开启之后再运行,控制台会给出一些信息。从信息中可以分析出僵尸对象。
这里说明对象已经被释放了,还依然被使用。
assign与weak,它们都是弱引用类型,最大的区别是什么?
weak 声明的变量对象释放后,制动赋值为nil
assign声明的变量对象释放后,不会自动赋值为nil,会造成野指针错误。
内存泄漏的检测方法
- 静态检测方法
1)手动内存检测 shift+command+B
2)自动内存检测 buildSetting -> Analyze during Build -> YES - 动态检测方法
instruments 打开方式 product -> profile - 析构方法(打印dealloc,看看是否调用了)
-
第三方内存检测工具
MLeaksFinder 不需要做任何操作 pod进去就可以使用了。原理就是runtime实现的。