先上一张大家再熟悉不过的图片(虽然高糊)
image.png
这个图基本上就把UIViewController常用的这几个方法的执行顺序说的很清晰了。下面我再废话一下~
常用方法的作用
init
实例初始化方法,用代码对view进行初始化,会调用此方法。
loadView
在UIViewController对象的view被访问并且为空的时候调用。但是你不应该手动调用他,系统在需要的时候会自动调用的,他会加载或创建一个view并把它赋值给UIViewController的view属性。
但是loadView有没有可能在VC生命周期内被多次调用呢?那确实是有可能的~
如果我们在处理内存警告时释放view属性:self.view = nil,如果之后再访问view就会再次调用loadView。
如果想通过代码来创建UIViewController的view,就要重写loadView方法,并且不需要调用[super loadView],第三点已经提到若没有xib文件, [super loadView]默认创建一个空白的UIView。我们既然要通过代码来自定义UIVIew,那么就没必要事先创建一个空白的UIView,以节省不必要的开销。当然调用了也不会出错,只是造成不必要开销。
viewDidLoad
类的成员对象和变量的初始化我们都会放在这个方法中,在类创建后,无论视图的展现与消失,只会在将要布局时调用一次。
当loadView将view载入内存中,会调用viewDidLoad方法来进一步设置。此时,视图层次已经存放到内存中,通常我们对于各种初始化数据的载入、初始设定、修改约束、移除视图等很多操作都可以在这个方法中实现。
视图层次(view hierachy):因为每个视图都有自己的子视图,这个子视图层次其实也可以理解为一棵树。树的根节点也就是根视图(root view)。在UIViewController中的view属性,它可以看做是其他所有子视图的容器。
viewWillAppear
视图将要展现的时候会调用。
系统在载入所有数据的时候,将会在屏幕上显示视图,这时会先调用这个方法,通常我们会在这个方法对即将显示的view做进一步的设置。比如:设置设备在不同方向时该如何显示,设置状态栏方向啊、设置视图显示样式啊。还有就是,当一个app有多个视图的时候,上下级视图切换也会调用这个方法,如果在调入视图时,需要对数据做更新,就只能在这个方法内实现。
viewDidAppear
视图完成显示时调用
在view被添加到视图层级中以及多视图,上下级视图企鹅二环时调用这个方法,在这里可以对正在显示的视图做进一步的设置。
viewWillDisappear
视图即将消失时调用
在视图切换时,当前视图在即将被移除或者被覆盖时,会调用该方法,但此时还没有调用removeFromSuperView。
viewDidDisappear
视图已经消失时调用
view已经消失或被覆盖,此时以调用removeFromSuperView。
dealloc
VC被释放的时候调用
视图被销毁,此时需要对你init和viewDidLoad中创建的对象进行释放。
didRecieveMemoryWarning
先上图
image.png
IOS下每个app可用的内存是被限制的,如果一个app使用的内存超过了这个阀值,则系统就会向该app发送Memory Warning消息。收到消息后,appa必须尽可能多的释放一些不必要的内存,否则ios会关闭app。
当app的VC收到Memory Waring后,默认的实现时检查当前控制器的view是否在使用,如果不使用,就置为nil.
IOS6之后是不会调用unload的。
-(void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];//即使没有显示在window上,也不会自动的将self.view释放。
// Add code to clean up any of your own resources that are no longer necessary.
// 此处做兼容处理需要加上ios6.0的宏开关,保证是在6.0下使用的,6.0以前屏蔽以下代码,否则会在下面使用self.view时自动加载viewDidLoad
if ([self.view window] == nil)// 是否是正在使用的视图
{
// Add code to preserve data stored in the views that might be
// needed later.
// Add code to clean up other strong references to the view in
// the view hierarchy.
self.view = nil;// 目的是再次进入时能够重新加载调用viewDidLoad函数。
}
}
网友评论