面试官要知道的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

相关文章
|
9月前
|
安全
阻塞队列的安全实现,定时器的安全实现(面试易考),超详细(一)
阻塞队列的安全实现,定时器的安全实现(面试易考),超详细
|
9月前
|
安全
阻塞队列的安全实现,定时器的安全实现(面试易考),超详细(二)
阻塞队列的安全实现,定时器的安全实现(面试易考),超详细
|
网络协议 Java
面试官:来聊聊ThreadDump内的线程状态吧
每当线上应用出现各种吞吐下降、RT增长、CPU飚高、内存溢出等问题的时候是不是脑阔疼。面对出现的问题,简直就是无从下口啊。 不要慌,其实对于线上出现的各种奇葩问题,我们使用ThreadDump就能解决90%了。 很多时候根本不需要对JVM参数进行各种复杂的调优,好好看看线程栈,优化优化你的代码,简直就是美滋滋的提升性能。
面试官:来聊聊ThreadDump内的线程状态吧
|
1月前
|
监控 Java
面试官:说一说如何优雅的关闭线程池,我:shutdownNow,面试官:粗鲁!
【6月更文挑战第4天】面试官:说一说如何优雅的关闭线程池,我:shutdownNow,面试官:粗鲁!
14 0
|
9月前
|
Java 测试技术 API
线程池,以及线程池的实现以及面试常问的问题,工厂模式,常见的锁策略(面试常考,要了解,不行就背)
线程池,以及线程池的实现以及面试常问的问题,工厂模式,常见的锁策略(面试常考,要了解,不行就背)
|
Java
【面试常问】线程中常用的方法
在我们日常开发中线程是必不可少的,那么线程中的方法也就成了面试中的高频问题,决定整理一下;如有错误还请个位指正!
58 0