流程:判断是否view属性为nil,如果为空,调用loadView方法,如果重写了loadView方法,那么从代码创建普通视图,如果没有重写并且有storyBoard或者xib文件,那么从storyBoard加载视图,如果没有,那么创建一个空的view。

初始化:

第一种初始化方法:假如MainUIViewController类继承了UIViewController类,mainUIViewController是MainUIViewController的实例对象,当调用Init方法的时候【MainUIViewController *mainUIViewController = [[MainUIViewController alloc] init]】,[super init]父类的init方法会自动调用【- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil】方法,如果有个和MainUIViewController同名的xib文件,xib文件所属权为MainUIViewController,Custom Class设置为MainUIViewController,并且Outlets中的view和视图中的view相连接。那么[initWithNibName: bundle:]方法会加载此UIView。

第二种初始化方法:假如自定义了一个rootView.xib作为UIViewController的view,那么调用【MainUIViewController *mainUIViewController = [[MainUIViewController alloc] initWithNibName:@"rootView" bundle:nil]】此方法初始化自己的视图,同样rootView.xib文件也要进行第一种方法一样的设置。

第三步初始化方法:假如没有.xib文件,以代码的方式创建UIViewController中的视图,那么在MainUIViewController.m文件中重写父类的- (void)loadView方法,两种重写方法:1.[super loadView]父类方法是创建一个empty View;2.自己创建一个UIView对象,赋值给self.view。如:

- (void)loadView{
  UIView *view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
  self.view = view;
  [view release];
}

  如果使用storyBoard或者xib文件创建view的时候,就不能重写父类的loadView方法,如果自己手动代码创建,那么需要重写loadView方法。在调用完loadView时,视图就加载完成了,会自动调用viewDidLoad方法,一般情况下,数据对象是通过配置UIViewController的属性来提供的,如果UIViewController需要一些额外的属性,那么需要重写此函数来提供数据。

加载过程:

1.首先访问UIViewController的view属性,如果存在,则直接加载view,如果为nil,那么调用loadView方法

2.loadView可以从nib文件加载,也可以从storyboard加载,也可以创建一个空视图,可以在此创建其它的控件

3.loadView加载完视图自动调用viewDidLoad方法,可以准备需要的数据,访问网络等...

4.viewWillAppear方法在视图出现在屏幕之前所做的工作(默认不做任何工作:Default does nothing)

5.viewDidAppear方法表示视图已经在屏幕上显示(默认不做任何工作:Default does nothing)。

代码执行顺序:

1、alloc                               创建对象,分配空间
2、init (initWithNibName)      初始化对象,初始化数据
3、loadView                        载入视图以及动态创建其他控件,重写时可调用[super loadView]来承接父类的视图
4、viewDidLoad                   载入完成,可以进行自定义数据,重写时可以调用viewDidLoad来承接父类的视图和数据
5、viewWillAppear               视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
6、viewDidAppear               视图已在屏幕上渲染完成

注意:当用get方法访问UIViewController中的View时(如:self.view),如果此时UIViewcontroller中的view为空nil;系统会自动调用- (void) loadView函数,每次访问都会进入此函数。在viewDidLoad方法中会访问ViewController对象中的view属性,所以在loadView方法中必须对其赋值,否则又会进入loadView方法,造成死循环!

  

UIViewController启动过程的更多相关文章

  1. Info.plist和pch文件的作用,UIApplication,iOS程序的启动过程,AppDelegate 方法解释,UIWindow,生命周期方法

    Info.plist常见的设置 建立一个工程后,会在Supporting files文件夹下看到一个“工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 注:在旧 ...

  2. iOS程序启动过程笔记

    CHENYILONG Blog 笔记 一.iOS程序的完整启动过程(有storyboard)1.先执行main函数,main内部会调用UIApplicationMain函数 2.UIApplicati ...

  3. zookeeper源码分析之一服务端启动过程

    zookeeper简介 zookeeper是为分布式应用提供分布式协作服务的开源软件.它提供了一组简单的原子操作,分布式应用可以基于这些原子操作来实现更高层次的同步服务,配置维护,组管理和命名.zoo ...

  4. [原] KVM 虚拟化原理探究(2)— QEMU启动过程

    KVM 虚拟化原理探究- QEMU启动过程 标签(空格分隔): KVM [TOC] 虚拟机启动过程 第一步,获取到kvm句柄 kvmfd = open("/dev/kvm", O_ ...

  5. Openfire的启动过程与session管理

    说明   本文源码基于Openfire4.0.2.   Openfire的启动       Openfire的启动过程非常的简单,通过一个入口初始化lib目录下的openfire.jar包,并启动一个 ...

  6. 探索 Linux 系统的启动过程

    引言 之所以想到写这些东西,那是因为我确实想让大家也和我一样,把 Linux 桌面系统打造成真真正正日常使用的工具,而不是安装之后试用几把再删掉.我是真的在日常生活和工作中都使用 Linux,比如在 ...

  7. Linux内核启动过程概述

    版权声明:本文原创,转载需声明作者ID和原文链接地址. Hi!大家好,我是CrazyCatJack.今天给大家带来的是Linux内核启动过程概述.希望能够帮助大家更好的理解Linux内核的启动,并且创 ...

  8. SpringMVC启动过程详解(li)

    通过对SpringMVC启动过程的深入研究,期望掌握Java Web容器启动过程:掌握SpringMVC启动过程:了解SpringMVC的配置文件如何配置,为什么要这样配置:掌握SpringMVC是如 ...

  9. Android源码——Activity组件的启动过程

    根Activity启动过程 Launcher启动MainActivity的过程主要分为6个步骤: 一.Launcher向ActivityManagerService发送一个启动MainActivity ...

随机推荐

  1. mysql导入导出

    1.导入整个库 进入数据库,source 进去的语句等同于直接连接数据库后数据的语句 >source /var/www/test.sql 或者 sy$ mysql -uroot -p 数据库名( ...

  2. Object转换为json格式

    public String toJSONString(Object obj)     {              SerializeWriter serializewriter = new Seri ...

  3. oracle视图V$BH && X$BH的使用列子

    1创建一个测试表,test,并且插入10000行数据:    SQL>  create table test (id int); SQL> begin      2  for i in 1 ...

  4. CSS:选择器大全

    一.概念: CSS主要的作用就是给网页中的dom元素设置样式,选择器则是用来匹配dom元素的. CSS中的选择器有很多种,常用的分别是标签选择器(根据元素标签名称),类选择器(根据元素class属性) ...

  5. Android java取得当前日期增加一天或多天

    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstanc ...

  6. PHP的压力测试工具ab.exe 和mpm介绍提高并发数

    该工具是apache自带的,可以用它来测试网站的并发量有多大和某个页面的访问时间. 基本用法: 1.  进入CMD,转到apache的bin目录下. 2.  执行命令ab.exe  -n 访问的问次数 ...

  7. [BS-21] 关于OC中对象与指针的思考

    关于OC中对象与指针的思考 1. 创建对象: OC中可通过代码Person *p = [[Person alloc] init];创建了一个对象p.该过程中内存情况为: 在当前线程的栈(默认1M)中, ...

  8. 号外号外:9月21号关于Speed-BI 《全国人口统计数据分析》开讲了

    引言:如何快速分析纷繁复杂的数据?如何快速做出老板满意的报表?如何快速将Speed-BI云平台运用到实际场景中?       本课程将通过各行各业案例背景,将Speed-BI云平台运用到实际场景中,通 ...

  9. Winform禁止容器内控件获得焦点时改变容器显示范围坐标

    在Winform中当容器的可视高度无法显示所有控件并且容器的AutoScroll属性设置为True的情况下,但点击容器内某个未显示完整的控件时,会出现容器的滚动条自动下滚的情况. 这是由于控件获得焦点 ...

  10. MyEclipse6.5注册码(转)

    新装的MyEclipse6.5在网上找了半天的注册码,都不可用.将下面的代码放在MyEclipse下运行后,可以得到注册码.这相当于一个注册机.我得到的如下: administrator nLR8ZC ...