RunLoop
RunLoop有5种模式, 通常使用的只有两种, NSRunLoopCommonModes是NSDefaultRunLoopMode和UITrackingRunLoopMode两种模式的合集.
-
NSDefaultRunLoopMode : App的默认的Mode, 通常主线程是在Model这个模式下运行的
-
UITrackingRunLoopMode : 界面跟踪Model, 用于ScrollView追踪屏幕滑动, 保证界面滑动时不受其他Model影响
-
NSRunLoopCommonModes : 占位使用的Model, 不是真正的Model
RunLoop相关类
CFRunLoopSourceRef
CFRunLoopSourceRef是事件源, 输入源, 比如点击事件.
- Source0 :
- Source1 : 基于Port的, 通过内核和其他线程通信. 接收/分发系统事件. 比如点击事件, 接收到之后, 分发下去, 交给Source0处理
- 硬件直接出发的事件进来之后首先会被Source1接收
方法调用栈:
CFRunLoopObserverRef
观察runLoop的状态改变
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
kCFRunLoopEntry = (1UL << 0),
kCFRunLoopBeforeTimers = (1UL << 1),
kCFRunLoopBeforeSources = (1UL << 2),
kCFRunLoopBeforeWaiting = (1UL << 5),
kCFRunLoopAfterWaiting = (1UL << 6),
kCFRunLoopExit = (1UL << 7),
kCFRunLoopAllActivities = 0x0FFFFFFFU
};
- 当数组中的对象释放之后, 会给数组中所有的对象发送一条release消息
- 当数组移除之后, 也会给数组里面的所哟对象发送一条release消息