因为一个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
网友评论