iOS main函数解析

2017-05-13  本文已影响531人  Civiy

我们都知道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函数的工作原理及参数意义,技术也一直没能提高,写下此文章记录一下自己的学习成果。

上一篇下一篇

猜你喜欢

热点阅读