RunLoop面试题

作者: Mr吴标 | 来源:发表于2016-05-20 10:42 被阅读754次

    1、什么是RunLoop?
    2、开发中如何使用RunLoop?什么应用场景?
    3、RunLoop和线程有什么关系?
    4、RunLoop的Mode作用是什么?
    5、RunLoop的实现原理和数据结构,什么时候会用到?
    6、RunLoop的基本概念,它是什么时候休眠的?
    7、自动释放池在什么时刻释放(一个autorelease对象在什么时候释放)?
    8、objc使用什么机制管理内存对象?
    9、猜想runloop内部是如何实现的?

    参考答案
    1、什么是 Runloop?
    从字面上讲就是运行循环。
    它内部就是do-while循环,在这个循环内部不断地处理各种任务。
    一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop得手动启动(调用run方法)
    RunLoop只能选择一个Mode启动,如果当前Mode中没有任何Source(Sources0、Sources1)、Timer,那么就直接退出RunLoop
    基本的作用就是保持程序的持续运行,处理app中的各种事件。通过runloop,有事运行,没事就休息,可以节省cpu资源,提高程序性能。
    
    Runloop对象
    iOS中有2套API来访问和使用RunLoop
    Foundation:NSRunLoop
    Core Foundation:CFRunLoopRef
    NSRunLoop和CFRunLoopRef都代表着RunLoop对象
    NSRunLoop是基于CFRunLoopRef的一层OC包装,所以要了解RunLoop内部结构,需要多研究CFRunLoopRef层面的API。
    
    3、Runloop与线程
    每条线程都有唯一的一个与之对应的RunLoop对象
    主线程的RunLoop已经自动创建好了,子线程的RunLoop需要主动创建
    RunLoop在第一次获取时创建,在线程结束时销毁
    获得RunLoop对象
    Foundation
    [NSRunLoop currentRunLoop]; // 获得当前线程的RunLoop对象
    [NSRunLoop mainRunLoop]; // 获得主线程的RunLoop对象
    
    Core Foundation
    CFRunLoopGetCurrent(); // 获得当前线程的RunLoop对象
    CFRunLoopGetMain(); // 获得主线程的RunLoop对象
    
    RunLoop相关类
    Core Foundation中关于RunLoop的5个类
    CFRunLoopRef
    CFRunLoopModeRef
    CFRunLoopSourceRef
    CFRunLoopTimerRef
    CFRunLoopObserverRef
    

    相关文章

      网友评论

      • 梁森的简书:runLoop的应用场景? 不知道能得到回复吗?😄
      • iCoder_木子弋:“如果当前Mode中没有任何Source(Sources0、Sources1)、Timer,那么就直接退出RunLoop” 这个时候runLoop应该是休眠而不是退出吧???

      本文标题:RunLoop面试题

      本文链接:https://www.haomeiwen.com/subject/afyyrttx.html