2018-10-15

NSTimer与RunLoop的关系
  • 什么是NSTimer
    NSTimer 官方的概念意思是:计时器提供执行延迟动作或定期动作的方法。 计时器等待直到经过一定的时间间隔然后触发,向指定的对象发送指定的消息。是指一个能从某个时刻周期性的执行我们方法的对象。
  • 什么是RunLoop
    RunLoop是iOS事件响应与任务处理最核心的机制,它贯穿iOS整个系统。
    RunLoop是一种事件运行循环机制,是保持应用程序持续运行的一种机制。正是由于该机制的存在,应用程序才能在没有事件发生的时候处于休眠状态,有事件发生的时候处于工作状态。以此来节约CPU资源。这也是它的一大特点。
  • RunLoop和线程的关系:
    RunLoop是用来管理线程的,每个线程对应一个RunLoop对象。我们不可以去创建当前线程的RunLoop对象,但是我们可以去获取当前线程的RunLoop。RunLoop就是来监听该线程有无事件发生,如果有就工作,如果没有就休眠。
    主线程的RunLoop对象默认开启,其他线程默认不开启。
  • 1.Runloop和线程的关系:一个Runloop对应着一条唯一的线程。 2.Runloop的创建:主线程Runloop已经创建好了,子线程的runloop需要手动创建。
    3.Runloop的生命周期:在第一次获取时创建,在线程结束时销毁。
NSTimer与Runloop的关系
  • 在我们进行多线程编程时,所有的Source都需要添加到Runloop中才能生效,对于我们的NSTimer当然也需要添加到Runloop中才能生效。如果一个Runloop中没有任何Source的话,会立即退出的。而主线程的Runloop在程序运行时,系统就已经为我们添加了很多Source到Runloop中,所以主线程的Runloop是一直存在的。

  • NSTimer添加到Runloop中,但是不运行。

    在iOS多线程中,每一个线程都有一个Runloop,但是只有主线程的Runloop默认是打开的,其他子线程也就是我们创建的线程的Runloop默认是关闭的,需要我们手动运行。

  • NSTimer 创建的两种方式

    第一种:
    NSTimer *timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(clickOnTimer) userInfo:nil repeats:YES];

    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
    第二种:
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(clickOnTimer) userInfo:nil repeats:YES];

  • 获得Runloop对象:

    1.获得当前Runloop对象:
    a. NSRunloop
    NSRunLoop * runloop1 = [NSRunLoop currentRunLoop];
    b.CFRunLoopRef
    CFRunLoopRef runloop2 = CFRunLoopGetCurrent();
    2.拿到当前应用程序的主Runloop(主线程对应的Runloop)
    a.NSRunloop
    NSRunLoop * runloop1 = [NSRunLoop mainRunLoop];
    b.CFRunLoopRef
    CFRunLoopRef runloop2 = CFRunLoopGetMain();

  • NSTimer 和 RunLoop 的简单使用

    https://blog.csdn.net/crazyduang/article/details/52582858

你可能感兴趣的:(2018-10-15)