·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> iOS程序的启动原理

iOS程序的启动原理

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

一.在一些老的项目中,有很多不是通过代码添加窗口和跟控制器。是通过设置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是接受不到旋转事件的。

 以上就是本篇博客全部内容,欢迎指正和交流。转载注明出处~