RunLoop---未完待续

项目中的main.m

在几乎所有的程序开发中程序一般都是从main函数开始运行的,那么IOS程序也不例外,在用Xcode新建工程的时候回为我们自动生成了一个main.m文件:

#import 
#import "AppDelegate.h"

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

这个方法有四个参数:

  • 第一个参数和第二个参数其实就是main函数的参数,分别代表:参数个数、参数内容;

  • 第三个参数代表UIApplication类(或子类)字符串---APP的单例对象是谁,这个参数默认为nil则代表默认为UIApplication类,用户可以自定义一个类继承于这个类;如果为nil则等价于NSStringFromClass([UIApplication class]),大家可以自己试验,效果完全一样;UIApplication是单例模式,一个应用程序只有一个UIApplication对象或子对象;

  • 第四个参数是UIApplication的代理类字符串,默认生成的是AppDelegate类,这个类主要用于监听整个应用程序生命周期的各个事件,当UIApplication运行过程中引发了某个事件之后会调用代理中对应的方法;

main函数为什么能保持不退出:
main函数中调用UIApplicationMain内部会启动一个主线程的RunLoop,RunLoop是对事件循环的维护机制,可以在有事做的时候做事,没事做的时候通过用户态到内核态的切换,使得当前线程处于休眠状态避免资源占用。

定义

RunLoop是通过内部维护的事件循环来对事件/消息进行管理的一个对象。

什么是事件循环

  1. 没有消息需要处理时,休眠以避免资源占用。由用户态转变为内核态
  2. 有消息需要处理时,立即被唤醒。由内核态转变为用户态

数据结构

NSRunLoop是对CFRunLoop的封装,提供了面向对象的API。

你可能感兴趣的:(RunLoop---未完待续)