以前喜欢在写代码的时候,注重每个细节的性能,后来发现这样效率很低,常常在细枝末节上浪费过多时间,印证了那句过早的优化是万恶之源,所以现在更倾向于用性能检测手段检查出问题所在,有目的的优化。
1.内存泄漏
iOS使用引用计数来来管理对象的释放,借鉴的C++的智能指针的机制,但这种机制本身也有问题,常见的有循环引用导致对象不能被释放。
1.1循环引用
可以使用腾讯开源的 MLeaksFinder 控件来实现监测。
原理
为基类NSObject添加一个方法
1 | -willDealloc |
方法的作用是,先用一个弱指针指向 self,并在一小段时间(3秒)后,通过这个弱指针调用 -assertNotDealloc,而 -assertNotDealloc 主要作用是直接中断言。
1 | - (BOOL)willDealloc { |
2.主线程流畅性监控
由于UIkit是线程不安全的,所以苹果规定把UI相关的刷新操纵放在主线程里执行,所以监控主线程的流畅度就能测量出App是否流畅,而App流畅,一般是监测FPS值,FPS达到60/s是理想状态,小于这个值就会失帧
原理:开启一个线程,监控runloop的状态 kCFRunLoopBeforeSources kCFRunLoopBeforeWaiting,计算出两个状态之间的差值,如果时间差大于15ms 即存在失帧。这个时候可以利用第三方不会线程栈,找出耗时的函数。