UIViewController的生命周期
2015-12-16 12:48
459 查看
一.UIViewController的作用
1.对内管理与之关联的view,对外跟其他ViewController通信和协调
loadView和viewDidLoad的一个区别:loadView时还没有view,而viewDidLoad时,view已经创建好了
2.ViewController对View的加载过程
1)先判断子类是否重写了loadView,如果有直接调用,之后调用viewDidLoad完成View的加载
2)如果子类没有重写loadView,是通过storyboard来加载的,storyboard的名字不为nil:
<span style="font-size:14px;">UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];</span><span style="font-size:18px;">
</span>则创建Storyboard中的View,再调用viewDidLoad完成View的加载
3)如果子类没有重写loadView,是通过nib来加载的,nib的名字不为nil:
<span style="font-size:14px;">ViewController *vc = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];</span><span style="font-size:18px;">
</span>创建nib对应的XIB的view
4)如果子类没有重写loadView,是通过nib来加载的,nib的名字为nil
则viewController会通过以下两个步骤找到与其关联的nib:
A.如果类名包含Controller,例如ViewController的类名是MyViewController,则查找是否存在MyView.nib;
B.找跟ViewController类名一样的文件,例如MyViewController,则查找是否存在MyViewController.nib。
注意:
第一步viewcontroller是判断子类是否重写了loadView,如果子类重写了loadView,不管子类在loadView里面能否获取到view,viewController都会直接调用viewDidLoad完成view的加载。
二.view和ViewController的创建阶段
1.init
在init里应该只有相关数据的初始化,而且这些数据都是比较关键的数据。init里不要调self.view,否则会导致ViewController创建view,view是以懒加载的方式进行创建的
2.loadView
只初始化view,一般用于创建比较关键的view如tableViewController的tabView,不可掉用view的getter(在掉super loadView前),最好也不要初始化一些非关键的view。如果你是从nib文件中创建的viewController在这里一定要首先调用super的loadView方法,但建议不要重载这个方法。
3.viewDidLoad
这时候view已经有了。最适合创建一些附加的view和控件,有一点需要注意的是,viewDidLoad会调用多次(viewcontroller可能多次载入view
4.viewWillAppear
viewWillAppear 这个一般在view被添加到superview之前,切换动画之前调用。在这里可以进行一些显示前的处理。比如键盘弹出,一些特殊的过程动画(比如状态条和navigationbar颜色)。
5.viewDidAppear
一般用于显示后,在切换动画后,如果有需要的操作,可以在这里加入相关代码。
6.viewDidUnload
这时候viewController的view已经是nil了。由于这一般发生在内存警告时,所以在这里你应该将那些不在显示的view释放了。比如你在viewcontroller的view上加了一个label,而且这个label是viewcontroller的属性,那么你要把这个属性设置成nil,以免占用不必要的内存,而这个label在viewDidLoad时会重新创建。
7.dealloc
1.对内管理与之关联的view,对外跟其他ViewController通信和协调
loadView和viewDidLoad的一个区别:loadView时还没有view,而viewDidLoad时,view已经创建好了
2.ViewController对View的加载过程
1)先判断子类是否重写了loadView,如果有直接调用,之后调用viewDidLoad完成View的加载
2)如果子类没有重写loadView,是通过storyboard来加载的,storyboard的名字不为nil:
<span style="font-size:14px;">UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];</span><span style="font-size:18px;">
</span>则创建Storyboard中的View,再调用viewDidLoad完成View的加载
3)如果子类没有重写loadView,是通过nib来加载的,nib的名字不为nil:
<span style="font-size:14px;">ViewController *vc = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];</span><span style="font-size:18px;">
</span>创建nib对应的XIB的view
4)如果子类没有重写loadView,是通过nib来加载的,nib的名字为nil
则viewController会通过以下两个步骤找到与其关联的nib:
A.如果类名包含Controller,例如ViewController的类名是MyViewController,则查找是否存在MyView.nib;
B.找跟ViewController类名一样的文件,例如MyViewController,则查找是否存在MyViewController.nib。
注意:
第一步viewcontroller是判断子类是否重写了loadView,如果子类重写了loadView,不管子类在loadView里面能否获取到view,viewController都会直接调用viewDidLoad完成view的加载。
二.view和ViewController的创建阶段
1.init
在init里应该只有相关数据的初始化,而且这些数据都是比较关键的数据。init里不要调self.view,否则会导致ViewController创建view,view是以懒加载的方式进行创建的
2.loadView
只初始化view,一般用于创建比较关键的view如tableViewController的tabView,不可掉用view的getter(在掉super loadView前),最好也不要初始化一些非关键的view。如果你是从nib文件中创建的viewController在这里一定要首先调用super的loadView方法,但建议不要重载这个方法。
3.viewDidLoad
这时候view已经有了。最适合创建一些附加的view和控件,有一点需要注意的是,viewDidLoad会调用多次(viewcontroller可能多次载入view
4.viewWillAppear
viewWillAppear 这个一般在view被添加到superview之前,切换动画之前调用。在这里可以进行一些显示前的处理。比如键盘弹出,一些特殊的过程动画(比如状态条和navigationbar颜色)。
5.viewDidAppear
一般用于显示后,在切换动画后,如果有需要的操作,可以在这里加入相关代码。
6.viewDidUnload
这时候viewController的view已经是nil了。由于这一般发生在内存警告时,所以在这里你应该将那些不在显示的view释放了。比如你在viewcontroller的view上加了一个label,而且这个label是viewcontroller的属性,那么你要把这个属性设置成nil,以免占用不必要的内存,而这个label在viewDidLoad时会重新创建。
7.dealloc
相关文章推荐
- UINavigationBar Background Color
- 关于UI布局中的常见布局类型、控件、控件属性以及引入布局的说明
- UICollectionView的使用
- iOS开发~视图(UIView)与控件(UIControl)
- UIPageViewController-浅析
- EASYUI COMBOBOX 自动补齐功能
- UItable配合数组的简单用法
- SQLiteDatabase中query、insert、update、delete方法参数说明
- Android UiAutomator第一个测试工程
- sonarquer搭建问题
- easyui如何动态显示、隐藏列
- 《GK101任意波发生器》升级固件发布(版本:1.0.2build955)
- 注册juery短信,验证码 验证
- Invalid result location value/parameter
- GUI线程
- Android UiAutomator环境配置
- ios UICollectionView实现不同大小cell等间距
- Sql语句:IF ELSE CASE WHEN WHILE CONTINUE BREAK
- 使用Supervisor管理resque
- UIView简介及常用设置