【分享】UIViewController生命周期简单归纳

一、调用顺序:

1. + (id)alloc 分配内存;

2. - (id)init 方法(包括其他-(id)init...方法),只允许调用一次,并且要与 alloc方法 写在一起,在init方法中申请的内存,要在dealloc方法中释放(或者其他地方);

3. - (void)awakeFromNib 使用Xib初始化后会调用此方法,一般不会重写此方法;

4. - (void)loadView 如果使用Xib创建ViewController,就不要重写该方法。一般不会修改此方法;

5. - (void)viewDidLoad 视图加载完成之后被调用,这个方法很重要,可以在此增加一些自己定义的控件,注意此时view的frame不一定是显示时候的frame,真实的frame会在 - (void)viewDidAppear: 后。

在iOS6.0+版本中在对象的整个生命周期中只会被调用一次,

这里要注意在iOS3.0~iOS5.X版本中可能会被重复调用,当ViewController收到内存警告后,会释放View,并调用viewDidUnload,之后会重新调用viewDidLoad,所以要支持iOS6.0以前版本的童鞋要注意这里的内存管理。

6. - (void)viewWillAppear:(BOOL)animated view 将要显示的时候,可以在此加载一些图片,和一些其他占内存的资源;

7. - (void)viewDidAppear:(BOOL)animated view 已经显示的时候;

8. - (void)viewWillDisappear:(BOOL)animated view 将要隐藏的时候,可以在此将一些占用内存比较大的资源先释放掉,在 viewWillAppear: 中重新加载。如:图片/声音/视频。如果View已经隐藏而又在内存中保留这些在显示前不会被调用的资源,那么App闪退的几率会增加,尤其是ViewController比较多的时候;

9. - (void)viewDidAppear:(BOOL)animated view 已经隐藏的时候;

10. - (void)dealloc,不要手动调用此方法,当引用计数值为0的时候,系统会自动调用此方法。

二、使用 NavigationController 去 Push 切换显示的View的时候,调用的顺序:

例如 从 A 控制器 Push 显示 B 控制器,

[(A *)self.navigationController pushViewController:B animated:YES]

1. 加载B控制器的View(如果没有的话);

2. 调用 A 的 - (void)viewWillDisappear:(BOOL)animated;

3. 调用 B 的 - (void)viewWillAppear:(BOOL)animated;

4. 调用 A 的 - (void)viewDidDisappear:(BOOL)animated;

5. 调用 B 的 - (void)viewDidAppear:(BOOL)animated;

总结来说,ViewController 的切换是先调用 隐藏的方法,再调用显示的方法;先调用Will,再调用Did。

三、重新布局View的子View

- (void)viewWillLayoutSubviews

- (void)viewDidLayoutSubviews
看字面意思就知道这两个方法是在View对他的子View进行布局的时候会被调用,包括View 显示/隐藏/屏幕旋转 的时候都会被调用。

如果设计的应用需要支持多方向可以在这里面进行一些UI的横竖屏适配。

打印附录:

2014-05-04 11:52:03.461 TestLifecycle[3141:60b] [ViewController viewDidLoad]

2014-05-04 11:52:03.463 TestLifecycle[3141:60b] [ViewController viewWillAppear:]

2014-05-04 11:52:03.464 TestLifecycle[3141:60b] [ViewController viewWillLayoutSubviews]

2014-05-04 11:52:03.465 TestLifecycle[3141:60b] [ViewController viewDidLayoutSubviews]

2014-05-04 11:52:03.516 TestLifecycle[3141:60b] [ViewController viewDidAppear:]

#Push一个新的ViewController : TestViewController

2014-05-04 11:52:07.219 TestLifecycle[3141:60b] [ViewController viewWillLayoutSubviews]

2014-05-04 11:52:07.220 TestLifecycle[3141:60b] [ViewController viewDidLayoutSubviews]

2014-05-04 11:52:07.298 TestLifecycle[3141:60b] [TestViewController viewDidLoad]

2014-05-04 11:52:07.299 TestLifecycle[3141:60b] [ViewController viewWillDisappear:]

2014-05-04 11:52:07.299 TestLifecycle[3141:60b] [TestViewController viewWillAppear:]

2014-05-04 11:52:07.303 TestLifecycle[3141:60b] [ViewController viewWillLayoutSubviews]

2014-05-04 11:52:07.303 TestLifecycle[3141:60b] [ViewController viewDidLayoutSubviews]

2014-05-04 11:52:07.304 TestLifecycle[3141:60b] [TestViewController viewWillLayoutSubviews]

2014-05-04 11:52:07.304 TestLifecycle[3141:60b] [TestViewController viewDidLayoutSubviews]

2014-05-04 11:52:07.806 TestLifecycle[3141:60b] [ViewController viewDidDisappear:]

2014-05-04 11:52:07.807 TestLifecycle[3141:60b] [TestViewController viewDidAppear:]

2014-05-04 11:52:07.807 TestLifecycle[3141:60b] [TestViewController viewWillLayoutSubviews]

2014-05-04 11:52:07.808 TestLifecycle[3141:60b] [TestViewController viewDidLayoutSubviews]

#在新的ViewController 中返回

2014-05-04 11:52:10.606 TestLifecycle[3141:60b] [TestViewController viewWillDisappear:]

2014-05-04 11:52:10.606 TestLifecycle[3141:60b] [ViewController viewWillAppear:]

2014-05-04 11:52:11.108 TestLifecycle[3141:60b] [TestViewController viewDidDisappear:]

2014-05-04 11:52:11.109 TestLifecycle[3141:60b] [ViewController viewDidAppear:]

时间: 2024-10-28 14:07:16

【分享】UIViewController生命周期简单归纳的相关文章

ViewController生命周期简单归纳

一.调用顺序: 1. + (id)alloc 分配内存: 2. - (id)init 方法(包括其他-(id)init...方法),只允许调用一次,并且要与 alloc方法 写在一起,在init方法中申请的内存,要在dealloc方法中释放(或者其他地方): 3. - (void)awakeFromNib 使用Xib初始化后会调用此方法,一般不会重写此方法: 4. - (void)loadView 如果使用Xib创建ViewController,就不要重写该方法.一般不会修改此方法: 5. -

UIViewController生命周期控制

UIViewController生命周期控制 UIViewController介绍 官方的介绍例如以下 The UIViewController class provides the fundamental view-management model for all iOS apps. You rarely instantiate UIViewController objects directly. Instead, you instantiate subclasses of the UIVie

你真的了解UIViewController生命周期吗?

一:首先了解一下生命周期图 二:UIViewController 生命周期介绍 1.通过alloc init 分配内存,初始化controller. 2.loadView loadView方法默认实现[super loadView] 如果在初始化controller时指定了xib文件名,就会根据传入的xib文件名加载对应的xib文件,如果没传xib文件名,默认会加载跟controller同名的xib文件,如果没找到相关联的xib文件,就会创建一个空白的UIView,然后赋給controller的

initWithFrame、initWithCoder、awakeFromNib的区别和调用次序 & UIViewController生命周期 查缺补漏

当我们创建或者自定义一个UI控件时,就很可能会调用awakeFromNib.initWithCoder .initWithFrame这些方法.三者的具体区别如下: initWithFrame: 通过代码创建UI控件的时候就会调用: initWithCoder:从文件中解析一个对象的时候就会调用这个方法,也就是说无论是通过代码还是xib,程序运行的时候都会调用这个方法: awakeFromNib:当一个对象从xib或者storyboard中加载完毕后,就会调用一次. 比如:当苹果官方提供的按钮不能

Android Activity的生命周期简单总结

Android Activity的生命周期简单总结 这里的内容参考官方的文档,这篇文章的目的不是去总结Activity是如何启动,如何创造,以及暂停和销毁的,而是从实际开发中分析在Activity各个生命周期,我们应该处理的内容. Activity 各个生命周期 由图可以看出 ,在一个activity的生命周期中,系统会像金字塔模型一样去调用一系列的生命周期回调函数.在最上端是当前Activity的运行状态,也就是说用户彻底看到这个Activity时,Activity正处于onResume()状

iOS对UIViewController生命周期和属性方法的解析

目录[-] iOS对UIViewController生命周期和属性方法的解析 一.引言 二.UIViewController的生命周期 三.从storyBoard加载UIViewController实例的传值陷阱 四.UIViewController与StroyBoard的相关相互方法 1.ViewController直接在StoryBoard中进行跳转的传值 2.使用代码跳转Storyboard中的controller 五.UIViewController之间的一些从属关系 1.parentV

【iOS开发】iOS对UIViewController生命周期和属性方法的解析

iOS对UIViewController生命周期和属性方法的解析 一.引言 作为MVC设计模式中的C,Controller一直扮演着项目开发中最重要的角色,它是视图和数据的桥梁,通过它的管理,将数据有条有理的展示在我们的View层上.iOS中的UIViewController是UIKit框架中最基本的一个类.从第一个UI视图到复杂完整项目,都离不开UIViewController作为基础.基于UIViewController的封装和扩展,也能够出色的完成各种复杂界面逻辑.这篇博客,旨在讨论UIV

浅谈UIViewController生命周期

UIViewController是IOS中顶层视图的载体和控制器,用户与程序界面的交互都是由UIViewController来控制的,UIViewController管理UIView的生命周期及资源的加载与释放. 我们创建一个简单的demo来测试一下其生命周期,新建两个ViewController,一个是A页面,一个是B页面.A页面有个按钮可以跳转到B页面,并且在每个ViewController的每个方法中都添加了NSLog来打印其状态.截取AViewController.m部分代码如下,  #

【iOS】UIViewController生命周期

UIViewController有2周期: 在UIViewController中,View存在两个循环:载入循环和卸载循环. 载入循环 1>程序请求controller的view. 2>假设view在内存中,则直接载入.相反,假设不存在.则UIViewController调用loadView方法. 3>loadView方法运行例如以下操作: 假设你重载了这种方法,则必须创建必要的view而且将一个非nil值传给UIViewController的view属性. 假设你没有重载这个函数,UI