iOS 涨薪: Run Loop 面试题

Run Loop

运行循环

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

Run Loop 两大功能:

  • 睡眠中,等待消息
  • 处理消息

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

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

RunLoop 的基本作用:

保持程序的持续运行

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

2、 RunLoop 内部实现逻辑?

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

    CFRunLoopRef

    CFRunLoopModeRef

    CFRunLoopSourceRef

    CFRunLoopTimerRef

    CFRunLoopObserverRef

  • __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;
    CFMutableSetRef _modes;
    struct _block_item *_blocks_head;
    struct _block_item *_blocks_tail;
    CFAbsoluteTime _runTime;
    CFAbsoluteTime _sleepTime;
    CFTypeRef _counterpart;
};

3、 RunLoop 和线程的关系?

  • 每条线程,都有唯一的一个,与之对应的 RunLoop 对象
    runloops[thread] = runloop

  • RunLoop 保存在一个全局的 Dictionary 里,线程作为 Key, RunLoop 作为 Value

  • 线程刚创建时,并没有 RunLoop 对象, RunLoop 会在第一次获取它时,创建

  • RunLoop 会在线程结束时,销毁线程都没有了,runloop 也就没有意义了

子线程,要什么 runloop?

没有 runloop , 就是命令行,调用一次就完结

有了 runloop, 可以反复休眠、唤醒、处理消息

  • 主线程的 RunLoop 已经自动获取 ( 创建 ),子线程默认没有开启 RunLoop
    子线程中,获取一下 currentRunLoop, 就创建开启了 RunLoop
CFRunLoopRef CFRunLoopGetCurrent(void<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值