Runloop监控卡顿

一、监控卡顿的原理

1.1、原理

我们通过监听 NSRunLoop 的状态,就能够发现调用方法是否执行 时间过长,从而判断出是否会出现卡顿

1.2、监听哪两个状态

  • 睡眠前
    无法进入睡眠,肯定会影响。
    对应状态kCFRunLoopBeforeSources
  • 唤醒后
    唤醒后,一直接收消息,无法进入下一步,肯定会影响。
    对应状态kCFRunLoopAfterWaiting

1.3、代码层面

  • 创建一个 CFRunLoopObserverContext 观察者
CFRunLoopObserverContext context = {0,(__bridge void*)self,NULL,NULL};
runLoopObserver = CFRunLoopObserverCreate(kCFAllocatorDefault,kCFRunLoopAllActivities,YES,0,&runLoopObserverCallBack,&context);

  • 将创建好的观察者 runLoopObserver 添加到主线程 RunLoopcommon 模式下观察。

  • 然后,创建一个持续的子线程专门用来监控主线程的 RunLoop 状态

  • 一旦发现进入睡眠前的kCFRunLoopBeforeSources 状态,或者唤醒后的状态kCFRunLoopAfterWaiting,在设置的时间阈值内一直没有变化,即可判定为卡顿

1.4、如何获取卡顿的方法堆栈信息

  • 直接调用系统函数
    用 signal 进行错误信息的获取。

  • PLCrashReporter

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 最近看了runloop应用中监控卡顿的一些博客,很多人都提到了通过kCFRunLoopBeforeSources和...
    YM_1阅读 10,369评论 3 22
  • 目录: App启动原理 RunLoop 的概念 RunLoop 与线程的关系 RunLoop 对外的接口 RunL...
    jiodg45阅读 4,336评论 0 6
  • RunLoop 是 iOS 和 OS X 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,...
    iOS_Alex阅读 4,369评论 0 10
  • 转自http://blog.ibireme.com/2015/05/18/runloop 深入理解RunLoop ...
    飘金阅读 4,565评论 0 4
  • 从现在开始我要做更好的自己,学着爱自己,滋润自己,再把爱传给我的家人,朋友,同事,周围的人……学着说好话从利他的角...
    小露1905阅读 1,430评论 0 5