Runloop 相关
Runloop 保持线程能随时处理事件而不退出
深入理解Runloop
- 线程和Runloop 的关系
线程和 RunLoop 之间是一一对应的,其关系是保存在一个全局的 Dictionary 里。线程刚创建时并没有 RunLoop,如果你不主动获取,那它一直都不会有。RunLoop 的创建是发生在第一次获取时,RunLoop 的销毁是发生在线程结束时。你只能在一个线程的内部获取其 RunLoop(主线程除外) - 一个 RunLoop 包含若干个 Mode,每个 Mode 又包含若干个 Source/Timer/Observer。每次调用 RunLoop 的主函数时,只能指定其中一个 Mode,这个Mode被称作 CurrentMode。如果需要切换 Mode,只能退出 Loop,再重新指定一个 Mode 进入。这样做主要是为了分隔开不同组的 Source/Timer/Observer,让其互不影响。
- Source/Timer/Observer 被统称为 mode item,一个 item 可以被同时加入多个 mode。但一个 item 被重复加入同一个 mode 时是不会有效果的。如果一个 mode 中一个 item 都没有,则 RunLoop 会直接退出,不进入循环
锁相关
@synchronized
- 传入@synchronized的参数和这个锁有什么关系?
- @synchronized是否持有它所加锁的对象?
- 如果传入@synchronized代码块的对象在代码块里被析构了或者被置为nil了会怎么样?
解答:
- 对于每个加了同步的对象,`Objective-C的运行时都会给其分配一个递归锁,并且保存在一个哈希表中。
- 一个被加了同步的对象被析构活着被置为nil都是没有问题的。然而文档中并没有对此进行什么说明
- 注意不要往@synchronized代码块中传入nil!这会毁掉代码的线程安全性。通过往objc_sync_nil加入断点你可以看到这种情况的发生。
@synchronized代码块隐式地给被保护的代码段添加了一个异常处理块。这就是为什么在给某个对象保持同步的时候,如果抛出了异常,锁就会被释放。
递归锁,是一种在已持有锁的线程重复请求锁却不会发生死锁的锁。你可以在这里找到一个相关的例子。有个很好用的类NSRecursiveLock
优化相关
待看
[浅谈Block] (http://www.jianshu.com/p/f9956b102d36)
[浅谈Clang] (http://www.jianshu.com/p/9fc7776cce9b)
网友评论