项目中的main.m
在几乎所有的程序开发中程序一般都是从main函数开始运行的,那么IOS程序也不例外,在用Xcode新建工程的时候回为我们自动生成了一个main.m文件:
#import <UIKit/UIKit.h>
#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是通过内部维护的事件循环
来对事件/消息进行管理
的一个对象。
什么是事件循环
- 没有消息需要处理时,休眠以避免资源占用。由用户态转变为内核态
- 有消息需要处理时,立即被唤醒。由内核态转变为用户态
数据结构
NSRunLoop是对CFRunLoop的封装,提供了面向对象的API。
网友评论