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对象.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];

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Run loop 剖析:Runloop 接收的输入事件来自两种不同的源:输入源(intput source)和定时...
    Mitchell阅读 14,277评论 17 111
  • 一、什么是runloop 字面意思是“消息循环、运行循环”。它不是线程,但它和线程息息相关。一般来讲,一个线程一次...
    WeiHing阅读 12,532评论 11 111
  • 基本概念 进程 进程是指在系统中正在运行的一个应用程序,而且每个进程之间是独立的,它们都运行在其专用且受保护的内存...
    小枫123阅读 4,468评论 0 1
  • runtime 和 runloop 作为一个程序员进阶是必须的,也是非常重要的, 在面试过程中是经常会被问到的, ...
    made_China阅读 4,941评论 0 7
  • 如果没有RunLoop main函数中的RunLoop 第14行代码的UIApplicationMain函数内部就...
    JonesCxy阅读 3,652评论 0 4

友情链接更多精彩内容