认识iOS的RunLoop

RunLoop是线程中的事件处理循环,用于监听并处理事件。本文详细介绍了RunLoop的工作原理,包括其如何在有任务时工作、无任务时休眠以节省资源。此外还介绍了主线程和子线程中RunLoop的不同配置方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RunLoop是线程中的一个事件处理循环,用来不断监听事件输入,并将其分配到相应的地方进行处理。

但是RunLoop不止是循环这么简单,它对事件进行了抽象和封装,使你免去处理琐碎的事情

并且它能在有工作的时候工作,没工作的时候休眠。

线程与RunLoop

RunLoop是线程的基础架构,每个线程,包括main线程都有与之对应的RunLoop

main线程的RunLoop是默认打开的,iOS程序在main函数的UIApplicationMain方法中,为main线程设置了一个NSRunLoop对象

所以我们的程序可以在有操作的时候及时响应,没操作的时候进入休眠,以减少资源占用

其他线程的RunLoop是默认不打开的,当你需要更多的线程交互时,可以手动配置

RunLoop对象

CFRunLoopRef是在 CoreFoundation 框架内的,它提供了纯 C 函数的 API,所有这些 API 都是线程安全的。

NSRunLoop 是基于 CFRunLoopRef 的封装,提供了面向对象的 API,但是这些 API 不是线程安全的。

NSRunLoop *mainRunLoop = [NSRunLoop mainRunLoop];
NSLog(@"#mainRunLoop:%p", mainRunLoop);

NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop];
NSLog(@"#currentRunLoop:%p", currentRunLoop);

CFRunLoopRef cfMainRunLoop = CFRunLoopGetMain();
NSLog(@"#cfMainRunLoop:%p", cfMainRunLoop);

CFRunLoopRef cfCurrentRunLoop = CFRunLoopGetCurrent();
NSLog(@"#cfCurrentRunLoop:%p", cfCurrentRunLoop);

// 子线程的RunLoop是默认不打开的,需要自己创建
NSThread *newThread = [[NSThread alloc] initWithBlock:^{
    // 子线程的RunLoop是懒加载的,在子线程中创建RunLoop,调用currentRunLoop方法即可
    NSRunLoop *newRunLoop = [NSRunLoop currentRunLoop];
    NSLog(@"#newRunLoop:%p", newRunLoop);
}];
[newThread start];

什么时候使用RunLoop

当你的程序需要辅助线程的时候,开启RunLoop可以保持线程长时间存活。

参考文章

深入理解RunLoop
iOS开发-Runloop详解
RunLoop的简单介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值