runloop的简单理解

问题引出:

当点击一个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 开发中用不到,因为系统都给我们封装好了。

runloop的简单理解_第1张图片
示意图一
runloop的简单理解_第2张图片
示意图二.png

二、runloop的作用(目的)

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

runloop有以下3个部分


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的简单理解)