拾遗

1.

对于RunLoop。系统定义了其他mode,并且可以在其他mode中执行runLoop,以限制处理哪些源,定时器和观察器。 由于runLoop只是指定为字符串,因此您还可以定义自己的自定义模式以限制事件的处理

2.Run loop并无并发

Run loop并不像 GCD 或者操作队列那样是一种并发机制,因为它并不能并行执行任务。不过在主 dispatch/operation队列中, run loop 将直接配合任务的执行,它提供了一种异步执行代码的机制。

3."计时器"的背后都是依靠runLoop来处理

无论你什么时候设置计时器、使用NSURLConnection或者调用performSelector:withObject:afterDelay:,其实背后都是 run loop 在处理这些异步任务。

4.commod mode

CF中有一种特殊的“假”mode即common mode,允许你将一个item添加到多个mode中;如果要指定commod模式,使用kCFRunLoopCommonModes常量作为模式名; 一个mode可以通过CFRunLoopAddCommonMode将mode的名字添加到commonModes中,每个runLoop都有自己独立的common模式集。每当RunLoop内容发生变化时,RunLoop会自动将_commonModeItems里的item同步到有"common"标记的mode

5.Autorelease和runloop

因为苹果只在主线程注册了Observer的回调 因此也只在主线程有autoreleasePool了

在主线程执行的代码,通常是写在诸如事件回调、Timer回调内的。这些回调会被 RunLoop 创建好的 AutoreleasePool 环绕着,所以不会出现内存泄漏,开发者也不必显示创建 Pool 了。

通过RunLoopObserver在RunLoop两次Sleep间对AutoreleasePool进行了Pop和PUsh 将这次Loop中产生的Autorelease对象释放

6.更换Mode时 需要停止当前Loop(退出当前Loop,而不是RunLoop),然后重启新的Loop

7. GCD中 dispatch到main queue的block被分发到main RunLoop执行,也只有这种情况,会在runloop执行

8. 计时器Timer的不准

计时器不是实时机制,只有当RunLoop的其中一个循环模式正在运行,并且能够检查计时器的出发时间是否已经过去,才会触发。如果运行循环处于未监视的定时器的mode或者有个长时间回调,定时器不会被触发直到下次runLoop检查定时器。因此,定时器可能发射的时间是在计划时间之后的某个时间,但是重复的定时器按照计划时间重新即使而不是实际触发时间。一个计时器同时只能注册在一个runLoop中,尽管他可以在该runloop中添加到多个modes