本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗漏或未能一一列举原文出处还望见谅与指出,另文章内容如有不妥之处还望指教,万分感谢 !
来看看RunLoop在main函数中调用
int main(int argc, char * argv[]) {
@autoreleasepool {
//在这里可以直观的看到关于RunLoop的启动
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
RunLoop的底层实现是纯C语言的;
- 官方给出的流程图
![](https://img.haomeiwen.com/i4068785/b7b757f8261fefc4.png)
- 详细的执行过程
![](https://img.haomeiwen.com/i4068785/19a2f74efcfcb89d.png)
-
RunLoop
通知监听器说:唉那谁!我要进入Loop
做事情了哦,你小心点 - (进入
Loop
之后)通知监听器说:唉胖妞,Timers
有东西啊,我待会要处理一下了哟 ! 你做好准备 - 擦擦汗!
Sources
里怎么也有东西 ?通知监听器:哼!我待会要去处理Sources
咯 ! - 呀
Blocks
里怎么也有东西,真麻烦 !嗨 还是搞一搞吧,先从你开始!谁让RunLoop
提供了CFRunLoopPerformBlock
服务呢 -
Blocks
完了哈 !再凑凑Sources
中的Source0
有东西没,如果有顺便搞搞,说不定那个小伙还会加Blocks
进去呢,有的话还需要再次处理下Blocks
-Source0
完事该Source1
咯,先判断一下Source1
在不在,有情况我就先不睡,处理完再睡吧 !不在我就睡觉去....... - 终于完事,通知监听器:唉我睡觉咯!
- 谁叫我......嗯 ? 看看是哪个 ?
timer
、GCD
、Source1
你们三个谁找我,好吧好吧起来了起来了 !嘿监听器 我起来搞一搞 ! 放心不会耽误事的 - 哎 忙一天了 看看
Blocks
有事没事,有了就也处理下吧 - 我去!还有事啊,罢了罢了;
- 不退出呀 ?哦那
重新从Timers
开始吧,这样比较科学 - 要退出啊,那好说
- 不退出呀 ?哦那
- 你要退出 ?是切换模式吗,还是线程要销毁 ?还是程序关闭了 ?都可以都可以退的 !!!
唉唉唉 你切换模式是要回到第一步的哟,别走错屋了!
其他都拜拜吧, 下班咯
注意:主线程的RunLoop只有在程序真正关闭时才会结束 !
网友评论