最近看了些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的代理.程序完成启动