最近看了些Runtime Runloop的一些知识.边看边摸索.看到群里有人在问 一些面试题.其中就提到了app的启动流程.

所以这里也研究小结一下,以供自己学习备用.

1.项目要运行,就要有入口. OC语言的入口就在main.m 文件.下面看main.m里都有什么可以窥探的.

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

在自动释放池里我们可以看到里面就一行代码

return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

这行代码我们手打一下.可以看到传的参数

UIApplicationMain(<#int argc#>, <#char * _Nonnull * _Null_unspecified argv#>, <#NSString * _Nullable principalClassName#>, <#NSString * _Nullable delegateClassName#>)

下面我们一步步解析这句关键的代码如何启动App

UIApplicationMain 就是OC的入门点. 里面传递了四个参数:

argc 是一个int参数

argv 是一个char 参数

principalClassName 主程序类名( 当值为 nil 时,默认是UIApplication)

delegateClassName 代理类名 默认就是常见的AppDelegate类

在上面的传参时候用到了NSStringFromClass 方法.

NSStringFromClass 是将类名转化为字符串的转化函数.与此类似的还有字符串转化类名的NSClassFromString.

2.设定了对象和代理之后就是NSRunloop 来保持程序一直运行处理事件(详情请看上一篇说的runloop文章)

3.接下来就是info.plist文件.检查是否通过main.storyboard加载指定的控制器. 把新创建的控制器作为窗口的跟控制器,让窗口显示出来.如果没有则会在下面方法中创建UIWindow 来作为主窗口

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

//创建UIWindow 来作为主窗口

return YES;

}

4.最后通过执行程序AppDelegate的代理.程序完成启动

03-15 12:02