[Deep dig] ViewController初始化过程调查
代码:https://github.com/xufeng79x/ViewControllerLife
1、简介:
介绍xib方式、storyborad方式以及code方式下ViewController的初始化过程。
2.实现
思路:

主屏幕上三个按钮分别实现三种不同方式创建的viewcontroller。在各个view的实现中基本上按照如下结构来查看控制器的整个生成过程:下面代码以xib方式创建的controller为例子。
-(instancetype)init
{
NSLog(@"MyViewController:init");
self = [super init];
return self;
}
-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
NSLog(@"xibController:initWithNibName the nibName = %@", nibNameOrNil);
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
return self;
}
- (instancetype)initWithCoder:(NSCoder *)coder
{
NSLog(@"xibController:initWithCoder");
self = [super initWithCoder:coder];
return self;
}
-(void)awakeFromNib{
NSLog(@"xibController:awakeFromNib");
}
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"xibController:viewDidLoad");
// 用于证明 root view就是指向xib文件中的view
[self.view performSelector:@selector(actionMyXibView)];
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
NSLog(@"xibController:viewWillAppear");
}
-(void)viewWillLayoutSubviews{
NSLog(@"xibController:viewWillLayoutSubviews");
}
-(void)viewDidLayoutSubviews{
NSLog(@"xibController:viewDidLayoutSubviews");
}
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
NSLog(@"xibController:viewDidAppear");
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
NSLog(@"xibController:viewWillDisappear");
}
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
NSLog(@"xibController:viewDidDisappear");
}
当点击按钮的时候会创建controller并打印上述方法的日志,以此查看不同方式的不同初始化过程。
xib方式:此种方式定义可参考[How to]如何通过xib来自定义UIViewController
-- :::] Show ViewController! 2016-03-18 11:19:30.373 CreateViewControlerFromXib[1711:58126] MyViewController:init 2016-03-18 11:19:30.373 CreateViewControlerFromXib[1711:58126] xibController:initWithNibName the nibName = (null) 2016-03-18 11:19:30.376 CreateViewControlerFromXib[1711:58126] MyXibView:awakeFromNib -- :::] xibController:viewDidLoad 2016-03-18 11:19:30.377 CreateViewControlerFromXib[1711:58126] I am a MyXibView instance! -- :::] rootViewController:viewWillDisappear -- :::] xibController:viewWillAppear -- :::] xibController:viewWillLayoutSubviews -- :::] xibController:viewDidLayoutSubviews -- :::] rootViewController:viewWillLayoutSubviews -- :::] rootViewController:viewDidLayoutSubviews -- :::] xibController:viewWillLayoutSubviews -- :::] xibController:viewDidLayoutSubviews -- :::] xibController:viewDidAppear -- :::] rootViewController:viewDidDisappear
结论:使用initWithNibName 作为初始化方法,不会触发自身的awakeFromNib但是会触发xib中定义的view的awakeFromNib方法
storyborad方式:
2016-03-18 11:27:10.659 CreateViewControlerFromXib[1779:62369] storyBoradController:initWithCoder 2016-03-18 11:27:10.659 CreateViewControlerFromXib[1779:62369] storyBoradController:awakeFromNib 2016-03-18 11:27:10.662 CreateViewControlerFromXib[1779:62369] MyStoryView:awakeFromNib -- :::] storyBoradController:viewDidLoad 2016-03-18 11:27:10.662 CreateViewControlerFromXib[1779:62369] I am a MyStoryView instance! -- :::] rootViewController:viewWillDisappear -- :::] storyBoradController:viewWillAppear -- :::] storyBoradController:viewWillLayoutSubviews -- :::] storyBoradController:viewDidLayoutSubviews -- :::] rootViewController:viewWillLayoutSubviews -- :::] rootViewController:viewDidLayoutSubviews -- :::] storyBoradController:viewWillLayoutSubviews -- :::] storyBoradController:viewDidLayoutSubviews -- :::] storyBoradController:viewDidAppear -- :::] rootViewController:viewDidDisappear
结论:使用initWithCoder为初始化方法同时会触发自身和定义在文件中的view的awakeFromNib方法。
code方式:
2016-03-18 11:24:15.864 CreateViewControlerFromXib[1744:60562] CodeViewController:init 2016-03-18 11:24:15.864 CreateViewControlerFromXib[1744:60562] CodeViewController:initWithNibName the nibName = (null) -- :::] CodeViewController:viewDidLoad -- :::] rootViewController:viewWillDisappear -- :::] CodeViewController:viewWillAppear -- :::] CodeViewController:viewWillLayoutSubviews -- :::] CodeViewController:viewDidLayoutSubviews -- :::] rootViewController:viewWillLayoutSubviews -- :::] rootViewController:viewDidLayoutSubviews -- :::] CodeViewController:viewWillLayoutSubviews -- :::] CodeViewController:viewDidLayoutSubviews -- :::] CodeViewController:viewDidAppear -- :::] rootViewController:viewDidDisappear
结论:使用initWithNibName作为初始化方法。不会触发自身的awakeFromNib方法。
其他结论:
1.viewDidLoad开始后面的初始化过程相同。
2.无论是storyborad方式还是xib方式,他们的rootview都是文件中定义的view,上述日志中的蓝色日志就是为了证明这一点。
对于rootview的初始化方式可以参考如下图:

当屏幕需要展示某个UiViewController的内容的时候会通过self.view方式获取此控制器的跟视图,默认的self.view会通过懒加载的方式去加载,也就是说一开始为nil的。当为nil的时候就会去
调用loadview方法来加载它,如何加载的参考上图。
完结。
[Deep dig] ViewController初始化过程调查的更多相关文章
- 【Spring源码分析】非懒加载的单例Bean初始化过程(下篇)
doCreateBean方法 上文[Spring源码分析]非懒加载的单例Bean初始化过程(上篇),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下 ...
- [转]在static代码块或static变量的初始化过程中使用ServiceManager提供的api的陷阱
一. 案例 1.源码: /** @hide */ private TelephonyManager(int slotId) { mContext = null; mSlotId = slotId; i ...
- Spring源码分析:非懒加载的单例Bean初始化过程(下)
上文Spring源码分析:非懒加载的单例Bean初始化过程(上),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下AbstractAutowireC ...
- Java类变量和成员变量初始化过程
一.类的初始化 对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量. 类的编译决定了类的初始化过程. 编译器生成的class文件主要对定义在源文件中的类进行了如下的更改: ...
- 【初探Spring】------Spring IOC(三):初始化过程---Resource定位
我们知道Spring的IoC起到了一个容器的作用,其中装得都是各种各样的Bean.同时在我们刚刚开始学习Spring的时候都是通过xml文件来定义Bean,Spring会某种方式加载这些xml文件,然 ...
- 【初探Spring】------Spring IOC(二):初始化过程---简介
首先我们先来看看如下一段代码 ClassPathResource resource = new ClassPathResource("bean.xml"); DefaultList ...
- java代码的初始化过程研究
刚刚在ITeye上看到一篇关于java代码初始化的文章,看到代码我试着推理了下结果,虽然是大学时代学的知识了,没想到还能做对.(看来自己大学时掌握的基础还算不错,(*^__^*) 嘻嘻……)但 ...
- java中对象产生初始化过程
以前面试的时候,很多公司的笔试题中有关new一个对象有关一系列初始化的过程的选择题目.请看下面的题目. class Parent { static { System.out.println(" ...
- Spring IoC容器的初始化过程
Spring IoC容器的初始化包括 BeanDefinition的Resource定位.载入和注册 这三个基本的过程.IoC容器的初始化过程不包含Bean依赖注入的实现.Bean依赖的注入一般会发生 ...
随机推荐
- 进程间通讯-2(pipe)
通过pipe 管道的方式也可以实现进程间通信. 父进程和子进程之间可以实现相互通信. from multiprocessing import Process, Pipe def f(conn): co ...
- Android 使用LocationManger进行定位
在Android应用中,往往有获取当前地理位置的需求,比如微信获取附近的人需要获取用户当前的位置,不多说,直接上例子. public Location getLocation() { Location ...
- BZOJ1047:[HAOI2007]理想的正方形——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1047 https://www.luogu.org/problemnew/show/P2216#sub ...
- BZOJ1503:[NOI2004]郁闷的出纳员——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1503 (题面复制的洛谷的,因为洛谷好看) 题目描述 OIER公司是一家大型专业化软件公司,有着数以万 ...
- CF17E:Palisection——题解
https://vjudge.net/problem/CodeForces-17E http://codeforces.com/problemset/problem/17/E 题目大意:给一个长度为n ...
- [Leetcode] combination sum ii 组合之和
Given a collection of candidate numbers ( C ) and a target number ( T), find all unique combinations ...
- 洛谷 P2657 [SCOI2009]windy数 解题报告
P2657 [SCOI2009]windy数 题目描述 \(\tt{windy}\)定义了一种\(\tt{windy}\)数.不含前导零且相邻两个数字之差至少为\(2\)的正整数被称为\(\tt{wi ...
- Lua Go R HEXO Kotlin 简单介绍
Lua Lua使用C编写而成的脚本语言.同为脚本语言的Python拥有庞大的类库工具包,定位于独立开发,Lua极度精简化,没有提供太多功能包,必须与C.C++等语言混合使用,目的是为了快速并动态的嵌入 ...
- Dalvik虚拟机中DexClassLookup结构解析
http://blog.csdn.net/roland_sun/article/details/46877563 原文如下: 在Android系统中,所有的类定义以及具体的代码都是包含在DEX文件中的 ...
- jq的each理解
1种 通过each遍历li 可以获得所有li的内容 <!-- 1种 --> <ul class="one"> <li>11a</li> ...