美文网首页iOS学习iOS开发
runloop的简单理解

runloop的简单理解

作者: 快乐的tomato | 来源:发表于2017-09-22 10:10 被阅读39次

    问题引出:

    当点击一个button的时候,是button调用这个方法,还是谁在调用这个方法?为什么会调用到这个方法?
    先来看一段代码

    int main(int argc, const char * argv[])
    {
        @autoreleasepool {
            
                NSLog(@"hello world");
        return 0;
    }
    

    上面一段代码运行之后就结束了,如果再次打印,需要打开再跑一遍。但是我们写的app程序运行之后是不会结束的,除非我们去双击home键去滑掉。那么我们的app不会主动结束是怎么实现的呢?
    如果想让上述代码不结束,我们可以加一个while语句,代码如下:

    int main(int argc, const char * argv[])
    {
        @autoreleasepool {
            int i = 0;
            // 死循环
            while (YES) {
                printf("请输入一个整数,0表示退出:");
                scanf("%d", &i);
                NSLog(@"%d", i);
                
                if (i == 0) {
                    break;
                }
            }
        }
        
        return 0;
    }
    
    

    一、what

    runloop的字面理解的意思是跑圈,循环。它的作用就类就类似于上面代码While代码的作用。
    一般情况下在iOS 开发中用不到,因为系统都给我们封装好了。

    示意图一 示意图二.png

    二、runloop的作用(目的)

    • 保证程序不退出
    • 负责监听事件,iOS中触摸,时钟,网络事件等等
    • 如果没有事情发生,就会进入休眠状态,节约性能

    runloop有以下3个部分


    image.png
    2.1CFRunLoopTimer

    上代码

      NSTimer *timer =  [NSTimer timerWithTimeInterval:3 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];
      //告诉runloop.
      [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    

    RunLoop有5种模式,以下3种最常用

    • NSDefaultRunLoopMode //苹果建议放时钟和网络事件
    • UITrackingRunLoopMode //优先级最高,只有UI事件才能唤醒
    • NSRunLoopCommonModes //默认包括上面第一和第二,占位模式,并不是一个真正的模式

    注意:如果在同一个线程中,UIUITrackingRunLoopMode事件优先级最高,会阻碍NSDefaultRunLoopMode ,造成卡顿现象,解决的方法是添加NSRunLoopCommonModes

    2.2CFRunLoopSource

    Source 事件源
    按照函数调用栈可以分为2类

    • source0
      处理App内部事件,App自己负责管理(触发),如UIEvent,CFSocket
    • source1
      由RunLoop和内核管理,Mach port驱动 如CFMach、CFMessage
    2.3CFRunLoopObserver

    三、runloop的深入理解

    下面是一位简友的理解iOS runloop
    我在网上看了一下@sunnnyxx 关于runloop的视频, http://v.youku.com/v_show/id_XODgxODkzODI0.html 或者搜索:iOS线下分享《RunLoop》by 孙源@sunnyxx

    这个简友写的不错IOS---实例化讲解RunLoop
    iOS---RunLoop深度剖析

    三、利用Runloop进行性能优化

    iOS-Runloop常驻线程/性能优化

    三、runloop相关的面试题

    1.阿里一面 runloop内部实现逻辑

    相关文章

      网友评论

        本文标题:runloop的简单理解

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