viewController的生命周期

一、结构

按结构可以对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会经常被继承,用来显示不同的数据给用户。而第二种很少被继承,除非你真的需要自定义它。
注:细心的同学应该能发现,在Xcode中新建一个ViewController时,只可以选择继承自UIViewController和UITableViewController,而它们都是第一种。

二、Controller和View的生命周期

这里指的View是指Controller的View。它作为Controler的属性,生命周期在Controller的生命周期内。就是说你的Controller不能在view释放前就释放了。

ViewController生命周期


当你alloc并init了一个ViewController时,这个ViewController应该是还没有创建view的。ViewController的view是使用了lazyInit方式创建,就是说你调用的view属性的getter:[self view]。在getter里会先判断view是否创建,如果没有创建,那么会调用loadView来创建view。loadView完成时会继续调用viewDidLoad。loadView和viewDidLoad的一个区别就是:loadView时还没有view。而viewDidLoad时view以及创建好了。
当view被添加其他view中之前时,会调用viewWillAppear,而之后会调用viewDidAppear。
当view从其他view中移出之前时,会调用viewWillDisAppear,而之后会调用viewDidDisappear。
当view不在使用,而且是disappeared,受到内存警告时,那么viewController会将view释放并将其指向nil。

三、代码组织(如何设计良好的viewcontroller)
ViewController生命周期中有那么多函数,一个重要问题就是什么代码该写在什么地方。
1、init里不要出现创建view的代码。良好的设计,在init里应该只有相关数据的初始化,而且这些数据都是比较关键的数据。init里不要掉self.view,否则会导致viewcontroller创建view。(因为view是lazyinit的)。
2、loadView中只初始化view,一般用于创建比较关键的view如tableViewController的tabView,UINavigationController的navgationBar,不可掉用view的getter(在掉super loadView前),最好也不要初始化一些非关键的view。如果你是从nib文件中创建的viewController在这里一定要首先调用super的loadView方法,但建议不要重载这个方法。
3、viewDidLoad 这时候view已经有了,最适合创建一些附加的view和控件了。有一点需要注意的是,viewDidLoad会调用多次(viewcontroller可能多次载入view,参见图2)。
4、viewWillAppear 这个一般在view被添加到superview之前,切换动画之前调用。在这里可以进行一些显示前的处理。比如键盘弹出,一些特殊的过程动画(比如状态条和navigationbar颜色)。
5、viewDidAppear 一般用于显示后,在切换动画后,如果有需要的操作,可以在这里加入相关代码。
6、viewDidUnload 这时候viewController的view已经是nil了。由于这一般发生在内存警告时,所以在这里你应该将那些不在显示的view释放了。比如你在viewcontroller的view上加了一个label,而且这个label是viewcontroller的属性,那么你要把这个属性设置成nil,以免占用不必要的内存,而这个label在viewDidLoad时会重新创建

转载于:https://www.cnblogs.com/pengjuwang/p/5052233.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android123 zhihuibeijing 新闻中心-新闻 页签 ViewPagerIndicator实现

## ViewPagerIndicator ## 使用导入ViewPagerIndicator库的方式相当于可以改源码,打包编译Eclips可以自动完成。ViewPager指针项目,在使用ViewPager的时候能够指示ViewPager所在的位置,就像Google Play中切换的效果一样,还能使用…

java 获取随机数字的三种方法

1 //方法1 (数据类型)2 //(最小值Math.random()*(最大值-最小值1))3 // 例:4 (int)(1Math.random()*(10-11)) //从1到10的int型随数5 6 方法2 获得随机数7 for (int i0;i<30;i)8 {9 System.out.println((int)(1Math.random()*10)); 10 } 11 (int)(1Math.random()*10) 1…

LVS原理及实践(NAT模式)

LVS无论NAT及DR模式&#xff0c;均要求LVS server和real server在同一个网段内&#xff0c;NAT需要把lvs server当作各个realserver的默认网关&#xff0c;DR模式采用修改mac地址直接从数据链路层转发、要求必须在同一个物理网段内 LVS-NAT的实验网络拓扑&#xff1a; 采用青…

基于Maven的spring_security入门

配置文件的修改点没什么变化&#xff0c;可以参考&#xff1a;http://blog.csdn.net/ouitiken/article/details/8830505 pom.xml的依赖参考&#xff1a; <dependencies><!-- Commons --><dependency><groupId>commons-dbcp</groupId><artifac…

使用Vitamio打造自己的Android万能播放器(5)——在线播放(播放优酷视频)

前言 为了保证每周一篇的进度&#xff0c;又由于Vitamio新版本没有发布&#xff0c; 决定推迟本地播放的一些功能&#xff08;截图、视频时间、尺寸等&#xff09;&#xff0c;跳过直接写在线播放部分的章节。从Vitamio的介绍可以看得出&#xff0c;其支持http、m3u8等多种网络…

20个新鲜出炉的网站模板【HTML PSD】

这里给大家分享20 个新鲜出炉的免费网站模板。这些设计元素将成为你下一个项目的重要素材&#xff0c;可以帮你节省很多的时间。与往常一样&#xff0c;我们经常漫游网络&#xff0c;寻找最好的资源&#xff0c; HTML、CSS 和 PSD 等等&#xff0c;记得关注啊。 您可能感兴趣的…

位运算总结(百科)

位运算 程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。 位运算 - 定义 在很多系统程序中常要求在位(bit)一级进行运算或处理。&#xff23;语言提供了位运算的功能&#xff0c; 这使得&#xff23;语言也能像汇编语…

归档(转)

如果是自定义类型的归档和解档&#xff0c;是按以下步骤实现如果不是自定义类型&#xff0c;直接第四步就可以。一、创建一个类User二、在User.h中遵循NSCoding协议 #import <Foundation/Foundation.h> interface User : NSObject<NSCoding> { int _userAge;//例子…

相遇

CPU直接识别的唯一语言是机器语言,为了克服机器语言的缺点,便将机器指令用便于记忆、并能描述指令功能的符号来表示称为指令助记符简称助记符 汇编语言由汇编指令,伪指令,和其它符号组成 汇编指令:机器码的助记符,有对应的机器码 伪指令:没有对应的机器码由编译器执行 其它符号…

相识

编译器&#xff1a;MASM 调试程序&#xff1a;DEBUG 编辑器&#xff1a;EditPlus

MySQL show命令的用法

show tables或show tables from database_name; // 显示当前数据库中所有表的名称show databases; // 显示mysql中所有数据库的名称show columns from table_name from database_name; 或show columns from database_name.table_name; // 显示表中列名称show grants for user_n…

怎么用代码制作WordPress的归档页面

先看看效果&#xff0c;这个是我网站的归档页面&#xff1a;http://www.shenjieblog.com/archives 其实WordPress自带了一个归档的功能&#xff0c;但是只能显示在网页中的某一个部分&#xff0c;但是我想单独制作一个归档页面&#xff0c;因为看见很多网站都有这个&#xff0c…

【web必知必会】—— 使用DOM完成属性填充

本文介绍了使用DOM的简单方法实现动态加载图片的功能。 前文介绍了&#xff1a; 1 DOM四个常用的方法 首先看一下效果&#xff0c;初始时是一个相册&#xff0c;可以点击导航&#xff0c;切换图片&#xff0c;并切换下方显示内容&#xff1a; 点击house&#xff0c;可以动态的切…

地址总线 数据总线

地址总线&#xff1a; CPU地址总线的宽度决定了它能寻址多少个内存单元地址,一个CPU有N根地址总线那么它的寻址能力为2^N次方。8086CPU地址总线宽度为20可寻址2^20次方个内存单元地址大小为1M。80386地址总线宽度为32可寻址内存为4GB 数据总线&#xff1a; CPU与存储器之间的数…

Spring事务配置方式(一) 拦截器方式配置

一、使用<tx:advice>和<aop:config>配置事务 <!-- 配置事务管理器 --><bean id"transactionManager" class"org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name"dataSource" ref&qu…

8086寄存器组

寄存器(14个)|AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES| >通用寄存器 数据寄存器(存放一般数据)AX (AH,AL) | BX (BH,BL) | CX (CH,CL) | DX (DH,DL) 指针寄存器 堆栈指针 基址指针SP BP (SS:SP) 变址寄存器 源地址 目的地址SI …

学习动态性能表(10)--v$session_longops

学习动态性能表 第十篇--V$SESSION_LONGOPS 2007.6.7 本视图显示运行超过6秒的操作的状态。包括备份&#xff0c;恢复&#xff0c;统计信息收集&#xff0c;查询等等。 要监控查询执行进展状况&#xff0c;你必须使用cost-based优化方式&#xff0c;并且&#xff1a; 设置TIME…

存储器

存储器以字节为单位存储信息,一个存储单元存储一个字节。一个字需要用两个连续的存储单元。 每一个存储单元有唯一的地址&#xff0c;称为存储单元地址。

JDBC常用API小结

建立数据库链接的三种方式&#xff1a; package com.victor_01;import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties;import org.junit.Test;public class Test1 {private String…