一、生命周期当一个视图控制器被创建,并在屏幕上显示的时候。 代码的执行顺序
1、 alloc                                   创建对象,分配空间
2、init (initWithNibName) 初始化对象,初始化数据
3、loadView                          从nib载入视图 ,通常这一步不需要去干涉。除非你没有使用xib文件创建视图
4、viewDidLoad                   载入完成,可以进行自定义数据以及动态创建其他控件
5、viewWillAppear              视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
6、viewDidAppear               视图已在屏幕上渲染完成
当一个视图被移除屏幕并且销毁的时候的执行顺序,这个顺序差不多和上面的相反
1、viewWillDisappear            视图将被从屏幕上移除之前执行
2、viewDidDisappear             视图已经被从屏幕上移除,用户看不到这个视图了
3、dealloc                                 视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放
关于viewDidUnload :在发生内存警告的时候如果本视图不是当前屏幕上正在显示的视图的话,  viewDidUnload将会被执行,本视图的所有子视图将被销毁,以释放内存,此时开发者需要手动对viewLoad、viewDidLoad中创建 的对象释放内存。 因为当这个视图再次显示在屏幕上的时候,viewLoad、viewDidLoad 再次被调用,以便再次构造视图。
二、view的加载过程文字说明在表述流程的时候总是很费力的,我又找到了如下的两张图跟随如下文字理解viewController对view加载过程:
1 先判断子类是否重写了loadView,如果有直接调用。之后调viewDidLoad完成View的加载。
2 如果是外部通过调用initWithNibName:bundle指定nib文件名的话,ViewController记载此nib来创建View。
3 如果initWithNibName:bundle的name参数为nil,则ViewController会通过以下两个步骤找到与其关联的nib。
A 如果类名包含Controller,例如ViewController的类名是MyViewController,则查找是否存在MyView.nib;
B 找跟ViewController类名一样的文件,例如MyViewController,则查找是否存在MyViewController.nib。
4  如果子类没有重写的loadView,则ViewController会从StroyBoards中找或者调用其默认的loadView,默认的loadView返回一个空白的UIView对象。
注意第一步,ViewController是判断子类是否重写了loadView,而不是判断调用子类的loadView之后 ViewController的View是否为空。就是说,如果子类重写了loadView的话,不管子类在loadView里面能否获取到 View,ViewController都会直接调viewDidLoad完成View的加载。三、view卸载过程图跟随以下文字理解卸载过程:
1 系统发出警告或者ViewController本身调用导致didReceiveMemoryWarning被调用
2 调用viewWillUnload之后释放View
3 调用viewDidUnload四、模拟器的调用顺序
我构架了这样一个环境,在该环境中有两个viewController,姑且命名为A和B,tag分别为1和2,A控制程序启动的时候即加载的界面,在A中放一个按钮,按下后会通过segue来调用到界面B;B 中页放一个按钮,通过执行
[self dismissModalViewControllerAnimated:YES];
来返回界面A
然后检测所有的函数调用,依次如下
加载A的时候依次调用1 initWithCoder
1 loadView //如果说你进行了重写,会在这里调用,这一步可以参考下文
1 viewDidLoad
1 viewWillAppear
1 viewWillLayoutSubviews
1 viewDidLayoutSubviews
1 viewDidAppear切换至B的时候依次调用2 initWithCoder             //先将2初始化
1 prepareForSegue       //调用1的准备过度的函数,所以在该函数中可以对界面B的一些相关属性进行赋值
2 loadView    //如果这里进行了重写
2 viewDidLoad              //2界面加载
1 viewWillDisappear
2 viewWillAppear
2 viewWillLayoutSubviews
2 viewDidLayoutSubviews
2 viewDidAppear
1 viewDidDisappear从B切换回A的时候依次调用2 viewWillDisappear
1 viewWillAppear
1 viewDidAppear
2 viewDidDisappear
2 dealloc顺序总结下来加载依次为:加载 - 显示 - 布局
完成顺序依次为:完成布局 - 完成显示  - 完成加载小注:-(void)loadView;函数如果重写,下面是一个可能的demo-(void)loadView
{CGRect applicationFrame = [[UIScreenmainScreen] applicationFrame];UIView *contentView = [[UIViewalloc] initWithFrame:applicationFrame];contentView.backgroundColor = [UIColordarkGrayColor];self.view = contentView;UILabel *lab = [[UILabelalloc]initWithFrame:CGRectMake(100, 100, 100, 100)];lab.text = @"HelloWorld";[self.viewaddSubview:lab];
}loadView虽然返回值为空,但必须在函数体内对self.view进行赋值,否则会在建立该界面的时候收到如下的log信息:
Application windows are expected to have a root view controller at the end of application launch
具体执行顺序为:代码执行了initWithCoder之后直接调用了三次loadView函数,并且没有调用其它函数(包括viewDidLoad 、viewWillDisappear、viewWillLayoutSubviews)
疑问:
暂不清楚为什么会调用三次,我的猜测是:上述三个函数分别检测了一遍view是否存在,发现不存在,所以各自调用了一遍viewLoad,最后发现依然不存在,所以上述三个函数分别返回了失败,加载完成
但矛盾的地方是:为什么上述三个函数本身没有执行到?底层到底做了什么?五、view和ViewController的创建阶段,关于什么时候应该干什么
1、init
Allocating critical data structures required by your view controller
不要出现创建view的代码。良好的设计,在init里应该只有相关数据的初始化,而且这些数据都是比较关键的数据。init里不要掉self.view,否则会导致viewcontroller创建view。(因为view是lazyinit的)。
2、loadView
Creating your view objects
只初始化view,一般用于创建比较关键的view如tableViewController的 tabView,UINavigationController的navgationBar,不可掉用view的getter(在掉super  loadView前),最好也不要初始化一些非关键的view。如果你是从nib文件中创建的viewController在这里一定要首先调用 super的loadView方法,但建议不要重载这个方法。
3、viewDidLoad
Allocating or loading data to be displayed in your view
这时候view已经有了,最适合创建一些附加的view和控件了。有一点需要注意的是,viewDidLoad会调用多次(viewcontroller可能多次载入view,参见图2)。
4、viewWillAppear 这个一般在view被添加到superview之前,切换动画之前调用。在这里可以进行一些显示前的处理。比如键盘弹出,一些特殊的过程动画(比如状态条和navigationbar颜色)。
5、viewDidAppear 一般用于显示后,在切换动画后,如果有需要的操作,可以在这里加入相关代码。
6、viewDidUnload
Releasing references to view objects
Releasing data that is not needed when your view is not displayed
这时候viewController的view已经是nil了。由于这一般发生在内存警告时,所以在这里你应该将那些不在显示的view释放了。比 如你在viewcontroller的view上加了一个label,而且这个label是viewcontroller的属性,那么你要把这个属性设置 成nil,以免占用不必要的内存,而这个label在viewDidLoad时会重新创建。
7、dealloc
Releasing critical data structures required by your view controller
六、几点备注:
1、按结构可以对iOS的所有ViewController分成两类:
1)、主要用于展示内容的ViewController,这种ViewController主要用于为用户展示内容,并与用户交互,如UITableViewController,UIViewController。
2)、用于控制和显示其他ViewController的ViewController。这种ViewController一般都是一个 ViewController的容器。如UINavigationController,UITabbarController。它们都有一个属 性:viewControllers。其中UINavigationController表示一种Stack式结构,push一个 ViewController或pop一次,因此后一个ViewController一般会依赖前一个ViewController。而 UITabbarController表示一个Array结构,各个ViewController是并列的。
第一种ViewController会经常被继承,用来显示不同的数据给用户。而第二种很少被继承,除非你真的需要自定义它。2、当view被添加其他view中之前时,会调用viewWillAppear,而之后会调用viewDidAppear。
当view从其他view中移出之前时,会调用viewWillDisAppear,而之后会调用viewDidDisappear。
当view不在使用,而且是disappeared,受到内存警告时,那么viewController会将view释放并将其指向nil。3、由于Controller加载View时,会自动将一些View对象指向其对应的IBOutlet变量。
所以当view被卸载时我们必须在viewDidUnload将这些变量release掉,ViewController不会自动做这件事。
具体做法是将变量设置为空,(注意和dealloc中将变量release的区别)注意此时Controller的view属性是空的。

转载于:https://www.cnblogs.com/lost-1987/articles/2886899.html

viewController详解相关推荐

  1. Present ViewController详解

    阅读:15112014-04-29 13:58 标签:弹出窗popwindowit 参考:http://www.cnblogs.com/linyawen/archive/2012/06/09/2542 ...

  2. iOS点滴- ViewController详解

    一.生命周期 当一个视图控制器被创建,并在屏幕上显示的时候. 代码的执行顺序 1. alloc                              创建对象,分配空间 2.init (initW ...

  3. iOS中 HTTP/Socket/TCP/IP通信协议详解 韩俊强的博客

    版权声明:本文为博主原创文章,未经博主允许不得转载. 每日更新关注:http://weibo.com/hanjunqiang  新浪微博 简单介绍: [objc] view plaincopy //  ...

  4. ios开发读取剪切板的内容_iOS中管理剪切板的UIPasteboard粘贴板类用法详解

    一.自带剪切板操作的原生UI控件在iOS的UI系统中,有3个控件自带剪切板操作,分别是UITextField.UITextView与UIWebView.在这些控件的文字交互处进行长按手势可以在屏幕视图 ...

  5. (iOS-基本知识)Category VS Extension 原理详解

    1.什么是Category? category是Objective-C 2.0之后添加的语言特性,别人口中的分类.类别其实都是指的category.category的主要作用是为已经存在的类添加方法. ...

  6. Cocos 2d-X Lua 游戏添加苹果内购(二) OC和Lua交互代码详解

    这是第二篇 Cocos 2d-X Lua 游戏添加苹果内购(一) 图文详解准备流程 这是前面的第一篇,详细的说明了怎样添加内购项目以及填写银行信息提交以及沙盒测试员的添加使用以及需要我们注意的东西,结 ...

  7. iOS开发 - OC - block的详解 - 基础篇

    深入理解oc中的block 苹果在Mac OS X10.6 和iOS 4之后引入了block语法.这一举动对于许多OC使用者的编码风格改变很大.就我本人而言,感觉block用起来还是很爽的,但一直以来 ...

  8. 【iOS 开发】基本 UI 控件详解 (UIButton | UITextField | UITextView | UISwitch)

    博客地址 : http://blog.csdn.net/shulianghan/article/details/50051499 ; 一. UI 控件简介 1. UI 控件分类 UI 控件分类 : 活 ...

  9. Swift - 多线程GCD详解

    //  GCD详解 //  目录: //  1. 创建GCD队列(最常用) //  2. 自定义创建队列 //  3. 使用多线程实现延迟加载 //  4. 使用多线程实现重复(循环) //  5. ...

最新文章

  1. 技嘉主板bios设置键盘不能用_BIOS不再硬梆梆、全新技嘉主板BIOS设置就算不是玩家也能轻松搞定...
  2. R语言应用substr函数和substring函数抽取(extract)、删除(Remove)、替换、匹配(Match)特定的字符串、并对比两个函数的异同、grepl检查子字符串是否存在于字符串中
  3. 如何在网站上同步查看BCH数据
  4. mysql commit慢_mysql autocommit问题导致的gtid同步变慢
  5. Hadoop源代码eclipse编译指南
  6. Jboss7.1.1配置SSL
  7. android 退出app代码_uniapp退出APP应用(IOS+安卓)
  8. 从零开始带你一步一步使用YOLOv3测试自己的数据
  9. MHA环境搭建【4】manager相关依赖的解决
  10. 【报告分享】2020年抖音kol生态研究报告.pdf(附下载链接)
  11. 敏捷开发一千零一问系列之五:怎样让队员主动要活?
  12. Mocha BSM基础架构管理——Windows主机监控
  13. 某人分析的70后,80后,90后
  14. 微信开发之小程序UI设计规范
  15. excel vba 去重
  16. EXCEL 自动求和
  17. 2021年疫情再度爆发,面对停课教培机构该如何应对?
  18. java nifty_java-jMonkey和Nifty中的线程?
  19. 遥感专业学习神经网络与深度学习过程中的想法
  20. 关于产品的一些思考——搜狐之搜狗输入法(手机版)

热门文章

  1. python中方法调用方法_Python中实现结构相似的函数调用方法
  2. jq点击事件多次响应_Jquery中on绑定事件 点击一次 执行多次 的解决办法
  3. otis电梯服务器tt使用说明_南充私人电梯
  4. php+new+mysqli+utf+8,MySQL和PHP:utf-8带有西里尔字符
  5. k8s挂载目录_K8S中挂载目录引发的血案!
  6. 重写equals方法---java
  7. java jstat 命令_java高分局之jstat命令使用(转)
  8. get方法请求返回一个文件_一键转换多种文件格式,完全免费,总有一个方法适合你...
  9. python项目打包部署到ios_Python iOS 自动打包脚本(包含上传到fir)
  10. 多个数据文件 mysql_mysql多实例(多个配置文件方式)