iOS开发iOS程序猿程序员

11.runloop相关面试题

2018-03-07  本文已影响20人  Lee丶Way

run loop,指的是一直在运行中的循环。所以runloop需要和线程紧密的结合起来,没有线程,就没有人处理runloop中的事件,故而没有线程,runloop就没有存在的意义。

二者关系

int main(int argc, char * argv[]) {
   @autoreleasepool {
       return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
   }
}

其中UIApplicationMain()函数,会在主Thread中设置一个RunLoop对象,正是因为一直有一个NSRunLoop一直在运行着,所以程序可以在无操作时候休眠,有响应时立马工作。

runloop中的mode的有哪些?都有什么作用

  1. NSDefaultRunLoopMode(kCFRunLoopDefaultMode):默认,空闲状态
  2. UITrackingRunLoopMode:ScrollView滑动时
  3. UIInitializationRunLoopMode:启动时
  4. NSRunLoopCommonModes(kCFRunLoopCommonModes):Mode集合
  1. NSDefaultRunLoopMode(kCFRunLoopDefaultMode)
  2. NSRunLoopCommonModes(kCFRunLoopCommonModes)

拓展面试题

如果我们把一个NSTimer对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环中的时候, ScrollView滚动过程中会因为mode的切换,而导致NSTimer将不再被调度。

同时因为mode还是可定制的,所以:

Timer计时会被scrollView的滑动影响的问题可以通过将timer添加到NSRunLoopCommonModes(kCFRunLoopCommonModes)来解决。代码如下:

//将timer添加到NSDefaultRunLoopMode中
[NSTimer scheduledTimerWithTimeInterval:1.0
     target:self
     selector:@selector(timerTick:)
     userInfo:nil
     repeats:YES];
//然后再添加到NSRunLoopCommonModes里
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0
     target:self
     selector:@selector(timerTick:)
     userInfo:nil
     repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
上一篇 下一篇

猜你喜欢

热点阅读