美文网首页
iOS main函数解析

iOS main函数解析

作者: Civiy | 来源:发表于2017-05-13 12:36 被阅读531次

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

    相关文章

      网友评论

          本文标题:iOS main函数解析

          本文链接:https://www.haomeiwen.com/subject/enuztxtx.html