RunLoop
是通过内部维护的事件循环来对事件/消息进行管理的一个对象;RunLoop
不是一个简单的do...while
循环,它涉及到用户态和内核态之间的切换。事件循环就是对事件/消息进行管理,事件循环可以达到:
mach_msg()
函数来转移当前线程的控制权给内核态/用户态。RunLoop
,main()
函数一执行完,程序就会立刻退出。
而我们的 iOS 程序能保持持续运行的原因就是在main()
函数中调用了UIApplicationMain
函数,这个函数内部会启动主线程的RunLoop
;RunLoop
:
① Foundation:NSRunLoop
(是CFRunLoopRef
的封装,提供了面向对象的 API)
② Core Foundation:CFRunLoopRef
NSRunLoop
和CFRunLoopRef
都代表着RunLoop
对象NSRunLoop
不开源,而CFRunLoopRef
是开源的:Core Foundation 源码 RunLoop
对象的方式: // Foundation
[NSRunLoop mainRunLoop]; // 获取主线程的 RunLoop 对象
[NSRunLoop currentRunLoop]; // 获取当前线程的 RunLoop 对象
// Core Foundation
CFRunLoopGetMain(); // 获取主线程的 RunLoop 对象
CFRunLoopGetCurrent(); // 获取当前线程的 RunLoop 对象
NSTimer
在滑动时停止工作的问题performSelector...
方法