学计算机的那个

不是我觉到、悟到,你给不了我,给了也拿不住;只有我觉到、悟到,才有可能做到,能做到的才是我的.

0%

iOS性能优化

以前喜欢在写代码的时候,注重每个细节的性能,后来发现这样效率很低,常常在细枝末节上浪费过多时间,印证了那句过早的优化是万恶之源,所以现在更倾向于用性能检测手段检查出问题所在,有目的的优化。

1.内存泄漏

iOS使用引用计数来来管理对象的释放,借鉴的C++的智能指针的机制,但这种机制本身也有问题,常见的有循环引用导致对象不能被释放。

1.1循环引用

可以使用腾讯开源的 MLeaksFinder 控件来实现监测。

原理

为基类NSObject添加一个方法

1
-willDealloc

方法的作用是,先用一个弱指针指向 self,并在一小段时间(3秒)后,通过这个弱指针调用 -assertNotDealloc,而 -assertNotDealloc 主要作用是直接中断言。

1
2
3
4
5
6
7
8
9
10
- (BOOL)willDealloc {
__weak id weakSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[weakSelf assertNotDealloc];
});
return YES;
}
- (void)assertNotDealloc {
NSAssert(NO, @“”);
}

2.主线程流畅性监控

由于UIkit是线程不安全的,所以苹果规定把UI相关的刷新操纵放在主线程里执行,所以监控主线程的流畅度就能测量出App是否流畅,而App流畅,一般是监测FPS值,FPS达到60/s是理想状态,小于这个值就会失帧

原理:开启一个线程,监控runloop的状态 kCFRunLoopBeforeSources kCFRunLoopBeforeWaiting,计算出两个状态之间的差值,如果时间差大于15ms 即存在失帧。这个时候可以利用第三方不会线程栈,找出耗时的函数。

Reference

1.MLeadksFinder简介

2.iOS实时卡顿监控