【iOS开发】UIWindow和程序启动原理
2015-03-31 01:13
429 查看
一、UIWindow
0、为什么要有UIWindow?
(1)首先理解几个对象的作用
*UIScreen :连接物理设备屏幕
*UIWindow:为UIScreen提供绘画支持,view要显示出来,必须要通过window提供的屏幕绘画支持,否则无法显示。除非该APP可以连接到其他设备上显示。
*UIView:很多view也有绘画功能,但是需要绘制好的图层copy到window上,才能显示在设备屏幕。
(2)所以说,没有window,view就不能显示。
1、创建出来的窗口必须设置大小尺寸才能显示,避免被销毁;一个应用程序只能有一个主窗口
2、窗口window
(1)常见的窗口:键盘,UIActionSheet,UIAlertView等都会交给UIApplication.Window的处理
(2)特殊窗口:状态栏,不会交给UIApplication管理,ios7之后交给控制器管理
3、窗口的层级(很多窗口情况下)
(1)层级: UIWindowLevelNormal<UIWindowLevelStatusBar<UIWindowLevelAlert
(2)窗口默认都是UIWindowLevelNormal
(3)键盘永远是最高层级的,在显示之前会获得当前所处的层级,然后+1
4、窗口显示底层实现
(1)为什么窗口要设置根控制器,而不能直接把子控件添加到window上
*没有根控制器,窗口上的子控件不能旋转
*让代码结构更清晰合理,不会把所有代码写在UIApplidelegate中
(2)设置 窗口rootViewController的底层实现:
第一步:让窗口可以旋转
第二步:将根控制器的View添加到窗口上
5、makeKeyAndVisible底层实现:
1.成为application的主窗口application.keyWindow
= self.window;
2.让窗口显示出来self.window.hidden = NO;(默认是NO)
3.把窗口根控制器的view添加到窗口上[self.window
addSubview:window.rootViewController.view];
二、程序启动原理
1、main函数 —》执行UIApplicationMain方法:
(1)创建UIApplication对象
(2)创建APPDelegate对象,并给application对象的delegate属性赋值为APPDelegate;
(3)创建主运行循环(死循环),避免程序一启动就退出
(4)加载info.plist文件,读取配置信息,判断有没有指定main.storyboard为程序根控制器,如果有,就加载main.storyboard中的控制器。
(5)main.storyboard底层操作:
1》创建UIWindow对象
2》创建storyboard中的控制器
3》把storyboard中的控制器最为窗口的跟控制器,并让窗口显示
4》加载main.storyboard的底层实现
(6)如果没有指定main.storyboard,那么需要在APPDelegate中创建窗口,并自定义控制器最为窗口的根控制器,并让窗口显示在屏幕上
2、通过storyboard来创建控制器 (参照storyboard的底层实现)
(1)先创建一个storyboard
(2)在storyboard中绑定该控制器,然后使用该storyboard来实例化一个控制器(利用了反射原理)
3、程序启动原理想详解图
【by:Leo_zzp,支持原创,转载请说明出处!】
个人邮箱:15999745308@163.com,GitHub链接:MrLeoZou,期待您的交流!
0、为什么要有UIWindow?
(1)首先理解几个对象的作用
*UIScreen :连接物理设备屏幕
*UIWindow:为UIScreen提供绘画支持,view要显示出来,必须要通过window提供的屏幕绘画支持,否则无法显示。除非该APP可以连接到其他设备上显示。
*UIView:很多view也有绘画功能,但是需要绘制好的图层copy到window上,才能显示在设备屏幕。
(2)所以说,没有window,view就不能显示。
1、创建出来的窗口必须设置大小尺寸才能显示,避免被销毁;一个应用程序只能有一个主窗口
2、窗口window
(1)常见的窗口:键盘,UIActionSheet,UIAlertView等都会交给UIApplication.Window的处理
(2)特殊窗口:状态栏,不会交给UIApplication管理,ios7之后交给控制器管理
3、窗口的层级(很多窗口情况下)
(1)层级: UIWindowLevelNormal<UIWindowLevelStatusBar<UIWindowLevelAlert
(2)窗口默认都是UIWindowLevelNormal
(3)键盘永远是最高层级的,在显示之前会获得当前所处的层级,然后+1
4、窗口显示底层实现
(1)为什么窗口要设置根控制器,而不能直接把子控件添加到window上
*没有根控制器,窗口上的子控件不能旋转
*让代码结构更清晰合理,不会把所有代码写在UIApplidelegate中
(2)设置 窗口rootViewController的底层实现:
第一步:让窗口可以旋转
第二步:将根控制器的View添加到窗口上
5、makeKeyAndVisible底层实现:
1.成为application的主窗口application.keyWindow
= self.window;
2.让窗口显示出来self.window.hidden = NO;(默认是NO)
3.把窗口根控制器的view添加到窗口上[self.window
addSubview:window.rootViewController.view];
二、程序启动原理
1、main函数 —》执行UIApplicationMain方法:
(1)创建UIApplication对象
(2)创建APPDelegate对象,并给application对象的delegate属性赋值为APPDelegate;
(3)创建主运行循环(死循环),避免程序一启动就退出
(4)加载info.plist文件,读取配置信息,判断有没有指定main.storyboard为程序根控制器,如果有,就加载main.storyboard中的控制器。
(5)main.storyboard底层操作:
1》创建UIWindow对象
2》创建storyboard中的控制器
3》把storyboard中的控制器最为窗口的跟控制器,并让窗口显示
4》加载main.storyboard的底层实现
(6)如果没有指定main.storyboard,那么需要在APPDelegate中创建窗口,并自定义控制器最为窗口的根控制器,并让窗口显示在屏幕上
2、通过storyboard来创建控制器 (参照storyboard的底层实现)
(1)先创建一个storyboard
(2)在storyboard中绑定该控制器,然后使用该storyboard来实例化一个控制器(利用了反射原理)
3、程序启动原理想详解图
【by:Leo_zzp,支持原创,转载请说明出处!】
个人邮箱:15999745308@163.com,GitHub链接:MrLeoZou,期待您的交流!
相关文章推荐
- iOS 【程序启动原理/手动创建UIWindow/UIApplicationMain做了些什么/makeKeyAndVisible底层实现】
- iOS开发之UIWindow,iOS程序启动
- iOS开发UI高级—02程序启动原理和UIApplication
- iOS开发UI篇—程序启动原理和UIApplication
- iOS开发UI篇—程序启动原理和UIApplication
- 7、iOS 开发之程序启动原理
- iOS开发UI篇—程序启动原理和UIApplication
- iOS开发UI篇—程序启动原理和UIApplication(★firecat入门推荐★)
- iOS开发UI篇—程序启动原理和UIApplication
- iOS开发UI篇—程序启动原理和UIApplication
- iOS开发UI篇—程序启动原理和UIApplication
- iOS开发——UI进阶篇(七)程序启动原理、打电话、发短信
- iOS从入门到精通---1.iOS开发App程序启动原理
- iOS开发UI篇—程序启动原理和UIApplication
- iOS开发UI篇—程序启动原理和UIApplication
- iOS开发UI篇之16程序启动原理和UIApplication
- iOS开发UI篇—程序启动原理和UIApplication
- iOS开发UI篇—程序启动原理和UIApplication
- iOS开发UI篇—程序启动原理和UIApplication
- ios开发-程序启动原理&项目中的常见文件(pch文件 & Info.plist)