面试官要知道的Runloop

简介: 面试官要知道的Runloop

因为一个GUI应用程序开始执行之后,就会不断执行一个迴圈,知道用户决定要离开这个应用程序的时候.才会离开这个迴圈.这样的迴圈在Windows平台下叫做messageloop,在iOS与MacOSX上叫做run

loop而这个运行循环所做的,就是收取分派事件

每一轮run loop的时间并不固定,会与这一轮run loop里面做了多少事情相关.例如说,我们的画面复杂,在App中同时又很多view,那么在这一轮runloop就得花上比较多的时间寻找first responder而像我们在UI上放了一个按钮,然后按钮按下去要做的一些事情(例如说下载图片),会全部算到runloop的时间.如果我们的程序做了一件很多时间的事情.让这一轮runloop执行非常久,就会导致应用程序界面没有回应.这种现象会让用户感觉到卡顿.

解决的办法是,耗时操作最好放在开一条子线程,让子线程去做,而跟新UI的事情让主线程去执行

面试官还不懵逼?继续接着说

Timer也是依靠run loop运作的.当我们建立了一个NSTimer物件之后,下一步就是要把timer物件注册到run loop当中.如果只建立了NSTimer物件.像是只做了alloc init这个timer不会起任何作用.而是应该使用sceduledTimerWithTimeInterval:target:selector:userInfo:repeats会在建立NSTimer物件之外.同时将timer加入到runloop中

timer运作的原理是,在每一轮run loop里头,会检查是否已经到了某个timer所指定的时间,如果到了,就指向timer所指定的selector.所以我们可以知道一下几件事情.

1.由于每一轮runloop的时间不一定,所以也不能够期待timer会非常精准的时间执行.前一轮runloop如果做了耗时操作,就会影响到原本应该执行timer实际执行的时间

2.虽然并没有所谓的最小时间单位这个事情,但是timer时间间隔也一定会有一个上限,我们不可能建立比runloop的频率还要频繁的timer

就拿aotu-release pool来说

在每一轮的run loop中,如果某些对象只有在这一轮runloop中有用,那么久就应该在这一轮中把它释放.我们可以先把对象放到auto -reease pool里头,等到这一轮run loop的时候,再把auto-release pool清空

好了说来这么多那么我们iOS的入口点在mian函数里会做如下几件事情

1.建立auto-release pool

2.调用UIApplicationMain这个function(函数)

3.建立UIApplication这个singleton(单例)

4.开始执行run loop

5.这些步骤执行完毕后,代表app已经开始执行

6.对UIApplication的delegate呼叫

在Cocoa于Cocoa

Touch应用程序中我们会使用CFRunloop与NSRunloop.描述runloop

相关文章
|
网络协议 Java
面试官:来聊聊ThreadDump内的线程状态吧
每当线上应用出现各种吞吐下降、RT增长、CPU飚高、内存溢出等问题的时候是不是脑阔疼。面对出现的问题,简直就是无从下口啊。 不要慌,其实对于线上出现的各种奇葩问题,我们使用ThreadDump就能解决90%了。 很多时候根本不需要对JVM参数进行各种复杂的调优,好好看看线程栈,优化优化你的代码,简直就是美滋滋的提升性能。
面试官:来聊聊ThreadDump内的线程状态吧
|
7月前
|
Java
面试官:说一说CyclicBarrier的妙用!我:这个没用过...
【5月更文挑战第5天】面试官:说一说CyclicBarrier的妙用!我:这个没用过...
51 2
|
6月前
|
监控 Java
面试官:说一说如何优雅的关闭线程池,我:shutdownNow,面试官:粗鲁!
【6月更文挑战第4天】面试官:说一说如何优雅的关闭线程池,我:shutdownNow,面试官:粗鲁!
35 0
|
7月前
|
存储 缓存 Java
【linux线程(四)】初识线程池&手撕线程池
【linux线程(四)】初识线程池&手撕线程池
|
Java 调度 Android开发
面试官:讲讲你对Activity启动机制的理解。。
笔者刚开始学习Android的时候也和大部分同学一样,只会使用一些应用层面的知识,对于一些比较常见的开源框架如<mark>RxJava</mark>,<mark>OkHttp</mark>,<mark>Retrofit</mark>,以及后来谷歌推出的<mark>协程</mark>等,都只在使用层面,对于他们<mark>内部原理</mark>,基本没有去了解觉得够用就可以了,又比如Activity,Service等四大组件的使用原理,系统开机过程,Launcher启动过程等知之甚少,知其然而不知其所以然,结果就是出现某些问题,不知道从哪里找原因,只能依赖万能的百度,但是百度看多了,你会发现自

热门文章

最新文章