程序员

Runloop是什么?

2016-05-07  本文已影响359人  海绵宝宝不要哭

从子面理解

Run:跑
loop:环

所以可以理解为
图形解释
运行循环
基本作用
APP中的分析

1:为什么我们的APP可以持续的运行?
2:为什么可以让APP可以处理我们的某些事件?

我们从一个最简单的APP入口动手

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

1:分析main函数

其实就是创建了一个主线程的Runloop对象,这个Runloop对象,可以让我们程序持续的运行,也就是说,我们main这里的大括号,一直都不会退出,大家可以理解为开启了一个死循环。

可以理解为如下:

由于main函数里面启动了一个Runloop,所以程序并不会立马退出,可以保存程序的持续的运行。


没有Runloop的情况下第三行程序运行就结束了

Xcode为我们生成的main函数

第14行代码UIAPPlicationMain函数内部就启动了一个Runloop

结论,我们程序的持续运行的原因是因为有了Runloop的这个对象。

接下来我们研究Runloop对象。

  • Foundation
    NSRunloop

1:NSRunloopCFRunloopRef都是代表着Runloop对象。
2:NSRunloop是基于CFRunloopRef的一层objective-c包装,所以要了解我们的Runloop,我们需要去多研究CFRunloopRef层面的API

(http://opensource.apple.com/source/CF/CF-1151.16/ "CFRunloopRef开源资料")

我们之前是看到了,在程序的主线程中自动启动了一个与之关联的Runloop,那么线程与Runloop对象的关系到底是怎么样的呢?

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSLog(@"%p %p",[NSRunLoop currentRunLoop],[NSRunLoop mainRunLoop]);   
}
主线程的当前```Runloop```对象以及主```Runloop```对象

我们接下来去子线程里面看一下,一条陌生的子线程和Runloop的关系

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    NSLog(@"%p %p",[NSRunLoop currentRunLoop],[NSRunLoop mainRunLoop]);
    
    NSThread *thred = [[NSThread alloc]initWithTarget:self selector:@selector(run) object:nil];
    [thred start];
    
}
-(void)run{
    
    //自己创建的子线程,是没有自动创建一个runloop对象的,只有主线程才会默认的创建一个runloop
    NSLog(@"%p",[NSRunLoop currentRunLoop]);
}

注意:Runloop对象的创建不是使用alloc以及init来创建,而是使用获取currentRunloop来创建,其实内部就是一个懒加载,在你第一次调用的时候便给你创建Runloop对象,并且给到你当前的线程.

创建一条子线程且为他创建一个Runloop对象

我们可以看得到,开启的那条子线程中的Runloop对象的地址指针和我们之前在viewDidLoadRunloop的内存地址指针是不一样的。

此时可能会想,是否是一条线程就有一条与之对应且唯一的一个Runloop对象。我们去到CFRunloopRef的开源代码去分析他。
(http://opensource.apple.com/source/CF/CF-1151.16/ "CFRunloopRef开源资料")

去到其中CFRunloop

我们可以看到很多开源的头文件

打开源码,我们可以看到这个函数的声明

```CFRunloopRef```内部源码

结论

上一篇 下一篇

猜你喜欢

热点阅读