iOS 底层 - runloop的执行流程

本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗漏或未能一一列举原文出处还望见谅与指出,另文章内容如有不妥之处还望指教,万分感谢 !

来看看RunLoop在main函数中调用

int main(int argc, char * argv[]) {
    @autoreleasepool {
        //在这里可以直观的看到关于RunLoop的启动
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

RunLoop的底层实现是纯C语言的;

  • 官方给出的流程图
官方流程图@2x.png
  • 详细的执行过程
执行过程@2x.png

  • RunLoop通知监听器说:唉那谁!我要进入Loop做事情了哦,你小心点
  • (进入Loop之后)通知监听器说:唉胖妞,Timers有东西啊,我待会要处理一下了哟 ! 你做好准备
  • 擦擦汗!Sources里怎么也有东西 ?通知监听器:哼!我待会要去处理Sources咯 !
  • Blocks里怎么也有东西,真麻烦 !嗨 还是搞一搞吧,先从你开始!谁让RunLoop提供了CFRunLoopPerformBlock服务呢
  • Blocks完了哈 !再凑凑Sources 中的Source0有东西没,如果有顺便搞搞,说不定那个小伙还会加Blocks进去呢,有的话还需要再次处理下Blocks
    -Source0完事该Source1咯,先判断一下Source1在不在,有情况我就先不睡,处理完再睡吧 !不在我就睡觉去.......
  • 终于完事,通知监听器:唉我睡觉咯!
  • 谁叫我......嗯 ? 看看是哪个 ?timerGCDSource1 你们三个谁找我,好吧好吧起来了起来了 !嘿监听器 我起来搞一搞 ! 放心不会耽误事的
  • 哎 忙一天了 看看Blocks有事没事,有了就也处理下吧
  • 我去!还有事啊,罢了罢了;
    • 不退出呀 ?哦那重新从Timers开始吧,这样比较科学
    • 要退出啊,那好说
  • 你要退出 ?是切换模式吗,还是线程要销毁 ?还是程序关闭了 ?都可以都可以退的 !!!唉唉唉 你切换模式是要回到第一步的哟,别走错屋了!其他都拜拜吧, 下班咯

注意:主线程的RunLoop只有在程序真正关闭时才会结束 !

你可能感兴趣的:(iOS 底层 - runloop的执行流程)