iOS中的RunLoop

作者: _那有只喵 | 来源:发表于2016-09-26 15:02 被阅读110次

    1.1.1Runloop是事件接收和分发机制的一个实现。Runloop提供了一种异步执行代码的机制,不能并行执行任务。在主队列中,Main RunLoop直接配合任务的执行,负责处理UI事件、定时器以及其他内核相关事件。
    RunLoop的主要目的:保证程序执行的线程不会被系统终止。

    1.1.2 对其它线程来说,run loop默认是没有启动的,如果你需要更多的线程交互则可以手动配置和启动,如果线程只是去执行一个长时间的已确定的任务则不需要。

    1.1.3 在任何一个Cocoa程序的线程中,都可以通过 NSRunLoop *runloop = [NSRunLoop currentRunLoop] 来获取到当前线程的run loop。

    1.2 关于run loop的几点说明
    1.2.1 Cocoa中的NSRunLoop类并不是线程安全的
    我们不能再一个线程中去操作另外一个线程的run loop对象,那很可能会造成意想不到的后果。不过幸运的是CoreFundation中的不透明类CFRunLoopRef是线程安全的,而且两种类型的run loop完全可以混合使用。Cocoa中的NSRunLoop类可以通过实例方法:

    • (CFRunLoopRef)getCFRunLoop;
      获取对应的CFRunLoopRef类,来达到线程安全的目的。

    1.2.2 Run loop的管理并不完全是自动的。
    我们仍必须设计线程代码以在适当的时候启动run loop并正确响应输入事件,当然前提是线程中需要用到run loop。而且,我们还需要使用while/for语句来驱动run loop能够循环运行,下面的代码就成功驱动了一个run loop:

       BOOL isRunning = NO;
        do {
            isRunning = [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDatedistantFuture]];
     } while (isRunning);
    

    1.2.3 Run loop同时也负责autorelease pool的创建和释放
    在使用手动的内存管理方式的项目中,会经常用到很多自动释放的对象,如果这些对象不能够被即时释放掉,会造成内存占用量急剧增大。Run loop就为我们做了这样的工作,每当一个运行循环结束的时候,它都会释放一次autorelease pool,同时pool中的所有自动释放类型变量都会被释放掉。
    1.3.4 Run loop的优点
    一个run loop就是一个事件处理循环,用来不停的监听和处理输入事件并将其分配到对应的目标上进行处理。如果仅仅是想实现这个功能,你可能会想一个简单的while循环不就可以实现了吗,用得着费老大劲来做个那么复杂的机制?显然,苹果的架构设计师不是吃干饭的,你想到的他们早就想过了。
    首先,NSRunLoop是一种更加高明的消息处理模式,他就高明在对消息处理过程进行了更好的抽象和封装,这样才能是的你不用处理一些很琐碎很低层次的具体消息的处理,在NSRunLoop中每一个消息就被打包在input source或者是timer source(见后文)中了。
    其次,也是很重要的一点,使用run loop可以使你的线程在有工作的时候工作,没有工作的时候休眠,这可以大大节省系统资源。

    相关文章

      网友评论

        本文标题:iOS中的RunLoop

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