@SanMao
2015-08-08T19:55:38.000000Z
字数 3262
阅读 1705
多线程
RunLoop在第一次获取时创建,在线程结束时销毁
CFRunLoopRef是开源的
http://opensource.apple.com/source/CF/CF-1151.16/
一个 RunLoop 包含若干个Mode,每个Mode又包含若干个Source/Timer/Observer
每次RunLoop启动时,只能指定其中一个 Mode,这个Mode被称作 CurrentMode
如果需要切换Mode,只能退出Loop,再重新指定一个Mode进入
这样做主要是为了分隔开不同组的Source/Timer/Observer,让其互不影响
系统默认注册了5个Mode:
NSDefaultRunLoopMode:App的默认Mode,通常主线程是在这个Mode下运行
UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView追踪触摸滑动,保证界面滑动时不受其他 Mode 影响
UIInitializationRunLoopMode: 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用
GSEventReceiveRunLoopMode: 接受系统事件的内部Mode,通常用不到
NSRunLoopCommonModes:这是一个占位用的Mode,不是一种真正的Mode
CFRunLoopTimerRef是基于时间的触发器
CFRunLoopTimerRef基本上说的就是NSTimer,它受RunLoop的Mode影响
GCD的定时器不受RunLoop的Mode影响
CFRunLoopSourceRef是事件源(输入源)
按照官方文档,Source的分类
按照函数调用栈,Source的分类
注意点: NSRunLoop只会检查有没有source和timer, 没有就关闭, 不会检查observer
自动释放池什么时候创建和释放
每次睡觉的时候都会释放前自动释放池, 然后再创建一个新的
什么是RunLoop?
自动释放池什么时候释放?
在开发中如何使用RunLoop?什么应用场景?
// 第1个参数: 需要给哪个定时器设置
// 第2个参数: 定时器开始的时间 / DISPATCH_TIME_NOW立即执行
// 第3个参数: 定时器开始之后的间隔时间
// 第4个参数: 定时器间隔执行的精准度,传入0代表最精准(尽量的让定时器精准), 传入一个大于0的值, 代表多少秒的范围是可以接受的
// 第四个参数存在的意义: 主要是为了提高程序的性能
// 注意点: Dispatch的定时器接收的时间是纳秒
dispatch_source_set_timer(<#dispatch_source_t source#>, <#dispatch_time_t start#>, <#uint64_t interval#>, <#uint64_t leeway#>);
// 第1个参数: 指定如何给observer分配存储空间
// 第2个参数: 需要监听的状态类型/kCFRunLoopAllActivities监听所有状态
// 第3个参数: 是否每次都需要监听
// 第4个参数: 优先级
// 第5个参数: 监听到状态改变之后的回调
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(<#CFAllocatorRef allocator#>, <#CFOptionFlags activities#>, <#Boolean repeats#>, <#CFIndex order#>, <#^(CFRunLoopObserverRef observer, CFRunLoopActivity activity)block#>);
// 第1个参数: 需要给哪个RunLoop添加观察者
// 第2个参数: 需要添加的Observer对象
// 第3个参数: 在哪种模式下可以可以监听
// 给主线程的RunLoop添加一个观察者
CFRunLoopAddObserver(<#CFRunLoopRef rl#>, <#CFRunLoopObserverRef observer#>, <#CFStringRef mode#>);