代码: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初始化过程调查的更多相关文章

  1. 【Spring源码分析】非懒加载的单例Bean初始化过程(下篇)

    doCreateBean方法 上文[Spring源码分析]非懒加载的单例Bean初始化过程(上篇),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下 ...

  2. [转]在static代码块或static变量的初始化过程中使用ServiceManager提供的api的陷阱

    一. 案例 1.源码: /** @hide */ private TelephonyManager(int slotId) { mContext = null; mSlotId = slotId; i ...

  3. Spring源码分析:非懒加载的单例Bean初始化过程(下)

    上文Spring源码分析:非懒加载的单例Bean初始化过程(上),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下AbstractAutowireC ...

  4. Java类变量和成员变量初始化过程

    一.类的初始化 对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量. 类的编译决定了类的初始化过程. 编译器生成的class文件主要对定义在源文件中的类进行了如下的更改: ...

  5. 【初探Spring】------Spring IOC(三):初始化过程---Resource定位

    我们知道Spring的IoC起到了一个容器的作用,其中装得都是各种各样的Bean.同时在我们刚刚开始学习Spring的时候都是通过xml文件来定义Bean,Spring会某种方式加载这些xml文件,然 ...

  6. 【初探Spring】------Spring IOC(二):初始化过程---简介

    首先我们先来看看如下一段代码 ClassPathResource resource = new ClassPathResource("bean.xml"); DefaultList ...

  7. java代码的初始化过程研究

        刚刚在ITeye上看到一篇关于java代码初始化的文章,看到代码我试着推理了下结果,虽然是大学时代学的知识了,没想到还能做对.(看来自己大学时掌握的基础还算不错,(*^__^*) 嘻嘻……)但 ...

  8. java中对象产生初始化过程

    以前面试的时候,很多公司的笔试题中有关new一个对象有关一系列初始化的过程的选择题目.请看下面的题目. class Parent { static { System.out.println(" ...

  9. Spring IoC容器的初始化过程

    Spring IoC容器的初始化包括 BeanDefinition的Resource定位.载入和注册 这三个基本的过程.IoC容器的初始化过程不包含Bean依赖注入的实现.Bean依赖的注入一般会发生 ...

随机推荐

  1. 优先队列实现 大小根堆 解决top k 问题

      摘于:http://my.oschina.net/leejun2005/blog/135085 目录:[ - ] 1.认识 PriorityQueue 2.应用:求 Top K 大/小 的元素 3 ...

  2. [BZOJ2067]szn

    description BZOJ权限题. solution 一道非常好的二分+贪心题目. 第一问就是\(\frac{\sum_u(deg[u]-1)}{2}+1\). 第二问需要在方案最优的情况下最长 ...

  3. [HDU4532]湫秋系列故事——安排座位

    题面在这里 description 有\(n\)种颜色的小球,每种颜色的小球有\(a_i\)个: 要把它们摆成一排,求相邻小球颜色不相同的摆放方案数. 任意两个合理的安排方法,只要有一个位置的同学不同 ...

  4. bzoj 1797: [Ahoi2009]Mincut 最小割 (网络流)

    太神了直接看了hzwer的题解,有个新认识,一条路径上满流的一定是这条路径上所有边的最小值. type arr=record toward,next,cap,from:longint; end; co ...

  5. linux 文件检索操作

    linux命令太多了,作为一个后端开发人员,常用的也就这几个 uname -a 查看版本 tail tail -f /data/wealth-consignment-service/logs/stat ...

  6. 淘淘相关DTO

    result 用于Controller层返回值或Controller于service层之间返回值 package com.taotao.common.pojo; import java.util.Li ...

  7. Codeforces Round #342 (Div. 2) C

    C. K-special Tables time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  8. 洛谷P4135 作诗 (分块)

    洛谷P4135 作诗 题目描述 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好是作诗. 由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章 ...

  9. 题解【luoguP1525 NOIp提高组2010 关押罪犯】

    题目链接 题解 算法: 一个经典的并查集 但是需要用一点贪心的思想 做法: 先将给的冲突们按冲突值从大到小进行排序(这很显然) 然后一个一个的遍历它们 如果发现其中的一个冲突里的两个人在同一个集合里, ...

  10. kubernetes创建资源对象yaml文件例子--pod详解

    apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中 kind: Pod #指定创建资源的角色/类型 metadata: #资源的元数据/属性 name: ...