我们都知道oc程序的入口是main函数,如下:
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
main函数的返回值是一个int类型 那么我们定义一个变量接收,并打印,看看这个参数是什么,能不能打印?
int main(int argc, char * argv[]) {
@autoreleasepool {
int a = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
NSLog(@"a=%d",a);
return a;
}
}
经过测试,日志是没有输出的,说明UIApplicationMain是个死循环,那么先看一下UIApplicationMain参数都是什么。
argh 代表的是长度,argv代表的是char 型数组,系统默认传进来的.
然后主要分析后面两个参数
// If nil is specified for principalClassName, the value for NSPrincipalClass from the Info.plist is used. If there is no
// NSPrincipalClass key specified, the UIApplication class is used. The delegate class will be instantiated using init.
UIKIT_EXTERN int UIApplicationMain(int argc, char *argv[], NSString * __nullable principalClassName, NSString * __nullable delegateClassName);
我们查看一下UIApplicationMain方法定义,发现后面两个参数都是NSString类型的,根据参数字面意思都是类名,第一个默认传nil,那具体代表的是哪个类?我们先从最后一个参数看起,最后一个是一个代理类类名,即AppDelegate的类名,NSStringFromClass([AppDelegate class]等价于@“AppDelegate”,后面这个是一个代理类,这个代理是实现的是谁的代理呢?查看AppDelegate.h发现是实现的UIApplication的代理,再根据苹果给出的注释来看,当这个类名为空时,先从Info.plist中读取NSPrincipalClass属性值,如果这个属性值不存在,则使用UIApplication类,说明最后两个参数一个是传UIApplication单例类,一个是实现UIApplication的代理AppDelegate,所以UIApplicationMain也可以改为UIApplicationMain(argc, argv, @"UIApplication", @"AppDelegate");其中第三个参数也可以是UIApplication类的子类。
我们再看一下UIApplicationMain死循环是什么?其实就是我们所说的runloop,那么内部开启死循环runloop的目的是什么?
1.保证当前线程(主线程)不被退出
2.负责监听事件(包括触摸事件、网络等等)
ps:目前只知道这个两种作用,有知道的可告解。
以上是我对main函数的一点见解,如有不对的地方或有好的见解请提出,欢迎大家批评指正~~~
虽然接触iOS这么久,一直没有研究过main函数的工作原理及参数意义,技术也一直没能提高,写下此文章记录一下自己的学习成果。
网友评论