iOS程序的启动原理
一.在一些老的项目中,有很多不是通过代码添加窗口和跟控制器。是通过设置MainInterface(设置最主要的xib),在xib中通过图形化的操作设置应用程序的代理->设置窗口->设置根控制器->设置跟控制器的view.
这种方式的启动过程:执行Main函数就会加载MainXib文件,并把UIApplication对象当做owner传入。
二.设置了Mainstoryboard(这种方式目前项目中很少用到,很多公司禁止使用storyboard)
1.先执行main函数,main内部会调用UIApplicationMain函数
注释: 进入main函数,在main.m的main函数中执行了UIApplicationMain这个方法,这是ios程序的入口点!
int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName)的参数分别是:
argc、argv:ISO C标准main函数的参数,直接传递给UIApplicationMain进行相关处理即可
principalClassName:指定应用程序类,该类必须是UIApplication(或子类)。如果为nil,则用UIApplication类作为默认值
delegateClassName:指定应用程序类的代理类,该类必须遵守UIApplicationDelegate协议 (例如上面代码中的ZHCAppDelegate)
此函数会根据principalClassName创建UIApplication对象,根据delegateClassName创建一个delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性
UIApplication 对象会依次给delegate对象发送不同的消息,接着会建立应用程序的main runloop(事件循环),进行事件的处理.
程序正常退出时这个函数才返回。如果进程要被系统强制杀死,一般这个函数还没来得及返回进程就终止了
2.在UIApplicationMain函数内部会:
1> 创建UIApplication对象,并设置它的代理对象-ZHCAppDelegate.
2> 开启一个消息循环
* 每监听到对应的系统事件时,就会通知ZHCAppDelegate
3> 为应用程序创建一个UIWindow对象(继承自UIView),设置为ZHCAppDelegate的window属性
4> 加载Info.plist文件,读取最主要storyboard文件的名称
5> 加载最主要的storyboard文件,创建白色箭头所指的控制器对象,并且设置创建的控制器为UIWindow的rootViewController属性(根控制器)
注:这个时候并没有创建控制器的view,控制器的view需要时才会创建。
6> 展示UIWindow,展示之前会将添加rootViewController的view到UIWindow上面(懒加载)
三.没有设置Mainstoryboard
1.先执行main函数,main内部会调用UIApplicationMain函数
2.在UIApplicationMain函数内部会:
1> 创建UIApplication对象,并设置它的代理对象-ZHCAppDelegate.
2> 开启一个消息循环
* 每监听到对应的系统事件时,就会通知ZHCAppDelegate
3> 程序启动完毕后会调用代理的
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
在这个方法中通过代码
1)创建窗口(UIWindow对象(继承自UIView),设置为ZHCAppDelegate的window属性),并设置为主窗口
2) 设置窗口的根控制器
注:
1.主窗口
1> 一个iOS app只能有一个主窗口(keyWindow),只有keyWindow才能接受文本框的输入事件
2> 如何访问主窗口
* [UIApplication sharedApplication].keyWindow
3.app中所有的窗口
* [UIApplication sharedApplication].windows
2.屏幕的旋转事件
1> 当屏幕旋转,UIApplication对象接受到旋转事件,接着会通知delagate
2> 最终,旋转事件传递到windnow身上,windnow会通知rootViewControler,rootViewControler自己会决定要不要做相应的旋转操作
这样直接把控制器的view添加到window上,rootViewControler是接受不到旋转事件的。
以上就是本篇博客全部内容,欢迎指正和交流。转载注明出处~