面试常问的Runloop和Runtime基础

一:Runloop

不知道大家有没有想过这个问题,一个应用开始运行以后放在那里,如果不对它进行任何操作,这个应用就像静止了一样,不会自发的有任何动作发生,但是如果我们点击界面上的一个按钮,这个时候就会有对应的按钮响应事件发生。给我们的感觉就像应用一直处于随时待命的状态,在没人操作的时候它一直在休息,在让它干活的时候,它就能立刻响应。其实,这就是run loop的功劳。

线程与run loop

1 线程任务的类型
再来说说线程。有些线程执行的任务是一条直线,起点到终点;而另一些线程要干的活则是一个圆,不断循环,直到通过某种方式将它终止。直线线程如简单的HelloWorld,运行打印完,它的生命周期便结束了,像昙花一现那样;圆类型的如操作系统,一直运行直到你关机。在IOS中,圆型的线程就是通过runloop不停的循环实现的。

2 线程与run loop的关系

Run loop,正如其名,loop表示某种循环,和run放在一起就表示一直在运行着的循环。实际上,runloop和线程是紧密相连的,可以这样说run loop是为了线程而生,没有线程,它就没有存在的必要。Runloops是线程的基础架构部分,Cocoa和CoreFundation都提供了run loop对象方便配置和管理线程的runloop(以下都已Cocoa为例)。每个线程,包括程序的主线程(main thread)都有与之相应的run loop对象。

3 主线程的run loop默认是启动的。

iOS的应用程序里面,程序启动后会有一个如下的main() 函数:
intmain(intargc,char*argv[])
{
@autoreleasepool{
returnUIApplicationMain(argc, argv,nil,NSStringFromClass([appDelegateclass]));
}
}

重点是UIApplicationMain() 函数,这个方法会为main thread 设置一个NSRunLoop 对象,这就解释了本文开始说的为什么我们的应用可以在无人操作的时候休息,需要让它干活的时候又能立马响应。

4 对其它线程来说,run loop默认是没有启动的,如果你需要更多的线程交互则可以手动配置和启动,如果线程只是去执行一个长时间的已确定的任务则不需要。

5 在任何一个Cocoa程序的线程中,都可以通过:

NSRunLoop*runloop = [NSRunLoopcurrentRunLoop];

来获取到当前线程的run loop。


关于Runloop的几个特性

Runloop工作的特点:
1>当有时间发生时,Runloop会根据具体的事件类型通知应用程序作出相应;
2>当没有事件发生时,Runloop会进入休眠状态,从而达到省电的目的;
3>当事件再次发生时,Runloop会被重新唤醒,处理事件.
提示:一般在开发中很少会主动创建Runloop,而通常会把事件添加到Runloop中.


Runloop的优点

runloop就是一个事件处理循环,用来不停的监听和处理输入事件并将其分配到对应的目标上进行处理。如果仅仅是想实现这个功能,你可能会想一个简单的

while循环不就可以实现了吗,用得着费老大劲来做个那么复杂的机制?显然,苹果的架构设计师不是吃干饭的,你想到的他们早就想过了。

首先,NSRunLoop是一种更加高明的消息处理模式,他就高明在对消息处理过程进行了更好的抽象和封装,这样才能是的你不用处理一些很琐碎很低层次的

具体消息的处理,在NSRunLoop中每一个消息就被打包在input source或者是timer source(见后文)中了。

其次,也是很重要的一点,使用run loop可以使你的线程在有工作的时候工作,没有工作的时候休眠,这可以大大节省系统资源。


什么时候使用Runloop

时机:
1.当需要和该线程进行交互的时候才会使用Runloop.
2.一般情况下我们是没有必要去启用线程的RunLoop的,除非你在一个单独的线程中需要长久的检测某个事件。

使用:每一个线程都有其对应的RunLoop,但是默认非主线程的RunLoop是没有运行的,需要为RunLoop添加至少一个事件源,然后去run它。


二:runtime

1.什么是runtime?
RunTime简称运行时。就是系统在运行的时候的一些机制,其中最主要的是消息机制。对于C语言,函数的调用在编译的时候会决定调用哪个函数。
runtime是一套底层的C语言API,包含很多强大实用的C语言数据类型和C语言函数,平时我们编写的OC代码,底层都是基于runtime实现的。

2.runtime有什么作用?

1.能动态产生一个类,一个成员变量,一个方法

2.能动态修改一个类,一个成员变量,一个方法

3.能动态删除一个类,一个成员变量,一个方法

3:runtime在开发中的用途
一:动态的遍历一个类的所有成员变量,用于字典转模型,归档解档操作
二:交换方法

通过runtime的method_exchangeImplementations(Method m1, Method m2)方法,可以进行交换方法的实现;一般用自己写的方法(常用在自己写的框架中,添加某些防错措施)来替换系统的方法实现,常用的地方有:

在数组中,越界访问程序会崩,可以用自己的方法添加判断防止程序出现崩溃数组或字典中不能添加nil,如果添加程序会崩,用自己的方法替换系统防止系统崩溃。

除了获取属性列表之外,还有方法调用,拦截调用,动态添加方法属性,关联对象(添加属性),方法交换,根据属性值获取属性名称(反射机制)等应用。

总结:

runtime 和 runloop 作为一个程序员进阶是必须的,也是非常重要的, 在面试过程中是经常会被问到的, 所以大家有必要进行研究。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值