【Runloop】深入理解原理和机制

只谈情不闲聊 提交于 2019-12-16 11:13:22

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

###用runloop解决cpu空转

直观认知runloop

CPU调度线程工作的时候,其中每一个线程都是一个runloop。
也就是如果有任务的时候,runloop会让线程执行任务,没有任务时候会让runloop休眠。
换句话说,那什么是一个runloop?一个UI事件,一个timer,一个系统delegate都称之为runloop(不是NSRunloop),
runloop实际上是从接收消息,然后处理完消息的一个完整过程。runloop使线程进入一个循环。

###runloop运行模式

一种Runloop运行模式,就是一个要监控的Input和Timer事件源的集合或者是一个要通知的Runloop观察者的集合。

###了解设置模式

NSDefaultRunLoopMode:默认的运行模式,用于大部分操作,除了NSConnection对象事件。
NSConnectionReplyMode:用来监控NSConnection对象的回复的,很少能够用到。
NSModalPanelRunLoopMode:用于标明和Mode Panel相关的事件。
NSEventTrackingRunLoopMode:用于跟踪触摸事件触发的模式(例如UIScrollView上下滚动)。
NSRunLoopCommonModes:是一个模式集合,当绑定一个事件源到这个模式集合的时候就相当于绑定到了集合内的每一个模式。
Cocoa应用默认包含Default、Panel、Event Tracking模式,Core Foundation只包含Default模式,
我们可以通过CFRunLoopAddCommonMode添加模式。

###runloop在哪里

主线程的NSRunloop默认自动运行,所以只有第二线程才需要我们自己运行NSRunloop。
并不是所有使用线程的情况都要运行NSRunloop,下面一些情况你需要运行NSRunloop:

需要使用Port或者自定义Input Source与其他线程进行通讯。
需要在线程中使用Timer。
需要在线程上使用performSelector*****方法。
需要让线程执行周期性的工作。
NSURLConnection在子线程中发起异步请求。

注意: 基于Cocoa的接口不是线程安全的,基于Core Foundation的接口是线程安全的。

###使用方法

[NSThread detachNewThreadSelector:@selector(loadPageInBackground:)toTarget:self withObject:nil];
[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

###换起runloop的三种方式

1.NSRunloop
2.runloop
3.AutoreleasePool

###额外了解

每一个Runloop, 系统会隐式创建一个Autorelease pool,这样所有的release pool会构成一个象CallStack一样的一个栈式结构,
在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!