美文网首页
性能相关

性能相关

作者: zcz19911 | 来源:发表于2018-07-25 18:49 被阅读0次

    测量应用启动时间

    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、在界面完全消失 并且 出栈状态,监听对象是否还存在。

    相关文章

      网友评论

          本文标题:性能相关

          本文链接:https://www.haomeiwen.com/subject/pahmmftx.html