iOS 这是你想要的

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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载:http://www.cocoachina.com/ios/20150601/11970.html RunL...
    Gatling阅读 1,488评论 0 13
  • 原文地址:http://blog.ibireme.com/2015/05/18/runloop/ RunLoop ...
    大饼炒鸡蛋阅读 1,196评论 0 6
  • 转自http://blog.ibireme.com/2015/05/18/runloop 深入理解RunLoop ...
    飘金阅读 1,024评论 0 4
  • 听了朋友的公众号感受很多,听到他在语音里面泣不成声的告诉大家他跟康熙的故事,突然就有点伤感,最近经常被这种情绪充斥...
    金银花小姐阅读 125评论 0 0
  • 小家伙今天爸爸要偷懒了,实在想不出要给你讲个什么故事。虽然脑子里有几个现成的小故事,可是,我知道不能随便拿点东西来...
    草覆虫阅读 230评论 0 0