RunLoop

RunLoop理解为一个让程序保持持续运行状态的循环,处理程序中的各种事件,本质是一个do while死循环,但就是这个死循环保证我们的程序不死。

  • 启动程序默认创建的一个RunLoop对象,main函数永远不会有返回值,main函数不会结束,程序一直在运行中。
int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
  • 每条线程都有唯一的一个与之对应的RunLoop对象
    主线程默认创建有runloop对象,子线程要自己创建(用currentRunLoop方法创建并获取)
    RunLoop在第一次获取时创建,在线程结束时销毁
//    CFRunLoopGetCurrent(); // [NSRunLoop currentRunLoop]  //获取当前runloop对象
//    CFRunLoopGetMain();  // [NSRunLoop mainRunLoop]  // 获取主线程runloop对象
  • CFRunLoopModeRef
    kCFRunLoopDefaultMode:App的默认Mode,通常主线程是在这个Mode下运行
    UITrackingRunLoopMode:界面跟踪Mode,用于ScrollView追踪触摸滑动,保证界面滑动时不受其他Mode影响
    kCFRunLoopCommonModes:这是一个占位用的Mode,不是一种真正的Mode,一种标签,kCFRunLoopDefaultMode和UITrackingRunLoopMode都有这种标签,所以设置这种mode时,上面两种状态下的事件都可以接收。


    RunLoop_第1张图片
    RunLoop对象.png
  • CFRunLoopObserverRef
    CFRunLoopObserverRef是观察者,能够监听RunLoop的状态改变

// 创建observer
    CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
        NSLog(@"----监听到RunLoop状态发生改变---%zd", activity);
    });

    // 添加观察者:监听RunLoop的状态
    CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);
    
    // 释放Observer
    CFRelease(observer);
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
    kCFRunLoopEntry = (1UL << 0),
    kCFRunLoopBeforeTimers = (1UL << 1),
    kCFRunLoopBeforeSources = (1UL << 2),
    kCFRunLoopBeforeWaiting = (1UL << 5),
    kCFRunLoopAfterWaiting = (1UL << 6),
    kCFRunLoopExit = (1UL << 7),
    kCFRunLoopAllActivities = 0x0FFFFFFFU
};
  • 常驻线程
    一般子线程都是在执行完某个任务后就销毁了,可以在这个线程内创建一个runloop对象,那么这个线程就就不会销毁,除非主动退出线程。
[NSThread exit];

要一个runloop对象能够一直运行下去,创建时必须给予一定的内容,不然创建之后会立即销毁。

[[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] run];
  • 定时器
[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];

// Creates and returns a new NSTimer object and schedules it on the current run loop in the default mode.
如官方文档所述,等价于

NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

学习笔记如有不正确的地方,欢迎各位大神指正!

你可能感兴趣的:(RunLoop)