标题由Martin开头的文章,均由Martin_Joy总结,再次感谢Martin童鞋!
前言
因为最近一直在准备校招,阅读了很多相关的书籍及blog,因为自己没有形成清晰的知识结构,导致越看越乱。无意中和朋友Martin_Joy聊起此事,发现他梳理的知识结构非常清晰,征得Martin的同意后,决定发上来,方便学习之用。由此可见,Martin童鞋是个非常乐于分享的人。在此,表示对他深深的感谢,也希望Martin在iOS开发的道路上越走越远。
runloop基本概念
runloop
可以看成和线程是一对一的关系,但是runloop
可以进行嵌套。runloop
主要用来处理各种事件,能够节省CPU
资源,在需要处理的时候唤醒,空闲的时候休眠。
猜想内部实现
function loop() {
initialize();
do {
var message = get_next_message();
process_message(message);
} while (message != quit);
}
唤醒和休眠
线程休眠前,指定用于唤醒我的mach_port
,然后去休眠后,系统内核会将线程挂起,处于mach_msg_trap()
状态,当其他线程(比如有一个进程在后面控制用户输入,一直在跑)向内核发送mach_msg
的时候,内核去mach_port
唤醒休眠的线程,休眠线程的trap
状态被唤醒,runloop
继续干活
实际运用
-
AFNetworking
:担心线程提前推出,导致NSOperation
无法接受回调,于是作者单独起一个thread
,内置一个runloop
,回调都由它接收,不占用主线程,也不耗CPU
资源。类似于常驻服务的线程。runloop
一直监听port
,使runloop
一直等待,怕他没事干,退出 -
TableView
中实现平滑滚动延迟加载图片:利用CFRunLoopMode
的特性,可以将图片的加载放到NSDefaultRunLoopMode
的mode
里,这样在滚动UITrackingRunLoopMode
这个mode
时不会被加载而影响到。 - 监控卡顿的方法
- iOS 实时卡顿监控
- 简单监测iOS卡顿的demo
- 检测iOS的APP性能的一些方法
- 微信iOS卡顿监控系统
- iOS实时卡顿监控
-
runloop
处理大量大图片加载问题 - iOS Fast Scrolling with RunLoop Work Distribution
- 在遇到崩溃的时候,自主处理例如弹出提示等
- 让Crash的App回光返照
- iOS 启动连续闪退保护方案
- 漫谈 iOS Crash 收集框架