iOS 涨薪: Run Loop 面试题

本文详细探讨了iOS中的Run Loop,包括其在保持程序运行、节省CPU资源中的作用,内部实现逻辑,与线程的关系,以及与Timer的交互。特别提到了在处理用户操作和线程间通信中的角色,还讨论了RunLoop的不同模式及其应用场景,是iOS开发者进阶和面试的重要知识点。
摘要由CSDN通过智能技术生成

Run Loop

运行循环

app 程序只有不停地运行, 才能不断响应用户的操作

Run Loop 两大功能:


  • 睡眠中,等待消息

  • 处理消息

从睡眠中 -> 处理消息, 需要一个唤醒的过程


1、 讲讲 RunLoop, 项目中有用到吗?

RunLoop 的基本作用:

保持程序的持续运行

节省 CPU 的资源,提高程序的性能 ( 没有事情,就请休眠,不要功耗。有事情,就处理)

在这里插入图片描述


2、 RunLoop 内部实现逻辑?

RunLoop 里面有很多种模式,他在运行的过程中,只会选择一种来运行

Modes, 就是 RunLoop 平时要做的事情

在这里插入图片描述

  • Core Foundation 中关于 RunLoop 的 5 个类:

CFRunLoopRef

CFRunLoopModeRef

CFRunLoopSourceRef

CFRunLoopTimerRef

CFRunLoopObserverRef


CFRunLoopModeRef

  • CFRunLoopModeRef 代表 RunLoop 的运行模式

  • 一个 RunLoop 包含若干个 Modes, 每个 Mode 又包含若干个 Source0 / Source1 / Timer / Observer

  • RunLoop 启动时,只能选择其中一个 Mode, 作为 currentMode

  • 如果需要切换 Mode, 只能退出当前 Loop, 再重新选择一个 Mode 进入

不同组的 Source0 / Source1 / Timer / Observer 能分割开来,互不影响

  • 如果 Mode 里没有任何 Source0 / Source1 / Timer / Observer , RunLoop 会立刻退出

  • __CFRunLoop 的数据结构
struct __CFRunLoop {
    CFRuntimeBase _base;
    pthread_mutex_t _lock;            /* locked for accessing mode list */
    __CFPort _wakeUpPort;            // used for CFRunLoopWakeUp 
    Boolean _unused;
    volatile _per_run_data *_perRunData;              // reset for runs of the run loop
    
    
    
    pthread_t _pthread;
    uint32_t _winthread;
    
    
    
    CFMutableSetRef _commonModes;
    CFMutableSetRef _commonModeItems;
    
    
    CFRunLoopModeRef _currentMode;
    

    // 这里有一个集合
    // 装的是一些 CFRunLoopModeRef 
    CFMutableSetRef _modes;
    // _modes 里面有很多 mode ( CFRun
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值