RunLoop

作者: ziyouzhe4 | 来源:发表于2017-04-06 12:19 被阅读60次

    详情见: iOS中的RunLoop

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

    
    参考答案
    1、什么是 Runloop?
    Run loops是线程的基础架构部分。一个run loop就是一个事件处理循环,用来不停的调配工作以及处理输入事件。
    使用run loop的目的是使你的线程在有工作的时候工作,没有的时候休眠。
    Run loop的管理并不完全是自动的。你仍必须设计你的线程代码以在适当的时候启动run loop并正确响应输入事件。
    Cocoa和CoreFundation都提供了run loop对象方便配置和管理线程的run loop。你创建的程序不需要显示的创建run loop;
    每个线程,包括程序的主线程(main thread)都有与之相应的run loop对象。但是,自己创建的次线程是需要手动运行run loop的。
    在carbon和cocoa程序中,程序启动时,主线程会自行创建并运行run loop。
    
    从字面上讲就是运行循环。
    它内部就是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

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