美文网首页iOS开发
iOS 这是你想要的

iOS 这是你想要的

作者: 楼上那位 | 来源:发表于2017-03-27 13:01 被阅读9次

    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,让其互不影响。
    RunLoop_0.png
    • 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)

    相关文章

      网友评论

        本文标题:iOS 这是你想要的

        本文链接:https://www.haomeiwen.com/subject/hqilottx.html