测量应用启动时间
1、测量main函数之前的时间:
添加环境变量:在 Edit scheme -> Run -> Arguments 中将环境变量 DYLD_PRINT_STATISTICS 设为 1。程序一运行就会打印出时间。
如果需要更详细的时间,设置 DYLD_PRINT_STATISTICS_DETAILS 为 1,然后重新运行。
2、从main函数到程序launch的时间:
在main函数定义开始的时间变量 CFAbsoluteTime startTime,
然后在launch方法里获取开始时间的变量:extern CFAbsoluteTime startTime,再用当前时间减去开始的时间,就得到从main到launch的时间。
内存泄露检测方法
1、静态检测方法
在Xcode的Build setting打开检测开关,打开后,Xcode每次Build工程都会检测是否有内存泄露。能比较及时的检测出内存泄露,但比较耗性能。
2、动态检测方法(Instrument工具)
3、析构函数——dealloc
比如:在控制器的dealloc方法打印一下,当控制器销毁之后,但没有走dealloc方法,说明有内存泄露。
4、第三方工具(腾讯WeRead团队的 MLeaksFinder 库)
MLeaksFinder 工作原理:引用博文所说
MLeaksFinder 一开始从 UIViewController 入手。我们知道,当一个 UIViewController 被 pop 或 dismiss 后,该 UIViewController 包括它的 view,view 的 subviews 等等将很快被释放(除非你把它设计成单例,或者持有它的强引用,但一般很少这样做)。于是,我们只需在一个 ViewController 被 pop 或 dismiss 一小段时间后,看看该 UIViewController,它的 view,view 的 subviews 等等是否还存在。
具体的方法是,为基类 NSObject 添加一个方法 -willDealloc 方法,该方法的作用是,先用一个弱指针指向 self,并在一小段时间(3秒)后,通过这个弱指针调用 -assertNotDealloc,而 -assertNotDealloc 主要作用是直接中断言。这样,当我们认为某个对象应该要被释放了,在释放前调用这个方法,如果3秒后它被释放成功,weakSelf 就指向 nil,不会调用到 -assertNotDealloc 方法,也就不会中断言,如果它没被释放(泄露了),-assertNotDealloc 就会被调用中断言。这样,当一个 UIViewController 被 pop 或 dismiss 时(我们认为它应该要被释放了),我们遍历该 UIViewController 上的所有 view,依次调 -willDealloc,若3秒后没被释放,就会中断言。
自己实现内存检测工具
根据 MLeaksFinder 的工作原理,我们可以实现这样一个需求:监听 UIViewController 类是否发生内存泄露(只考虑 push、pop 情况)。
思路:在视图控制器出栈,并在视图完全消失的时候,监听对象是否还存在。
步骤:
1、交换视图控制器 ViewWillAppear 与 swizzled_viewWillAppear 方法,viewDidDisappear 与 swizzle_viewDidDisappear 方法。
2、使用关联方法,获取和设置视图进出栈状态。
3、在界面完全消失 并且 出栈状态,监听对象是否还存在。