视图控制器的生命周期方法

来源:互联网 发布:linux 内核版本 编辑:程序博客网 时间:2024/05/21 13:23

1、application:didFinishLaunchingWithOptions:

在该方法中设置和初始化应用窗口的根视图控制器。该方法只会在应用启动完毕后调用一次,之后如果从其他应用切换回本应用,则该方法不会再次被调用。如果关闭应用后台进程,并重新启用该应用,该方法才会重新被调用

2、initWithNibName:bundle:

该方法是UIViewController的指定初始化方法,创建视图控制器时就会调用该方法。在某些情况下,需要在同一个应用创建多个相同的UIViewController子类对象,每次创建一个该类的对象时,都会调用一次该类的initWithNibName:bundle:方法。

3、loadView:

初始化view,由系统调用。
可以覆盖该方法,使用代码方式设置视图控制器的view属性

4、viewDidLoad:

可以覆盖该方法,设置使用NIB文件创建的视图对象。该方法会在视图控制器加载完视图后被调用。(该方法会在载入视图后立刻被调用,因此可以用于检查视图控制器的视图是否已经加载)

5、viewWillAppear:

可以覆盖该方法,设置使用NIB文件创建的视图对象。该方法和viewDidLoad:会在每次视图控制器的view显示在屏幕上时被调用
相反,viewWillDisappear:viewDidDisappear:方法会在每次视图控制器的view从屏幕上消失时调用
因此,如果打开HypnoNerd应用并在Hypnosis和Reminder两个标签项之间来回切换,那么BNRReminderViewController的viewDidLoad方法只会被调用一次,而viewWillAppear:方法会被调用很多次

viewDidAppear

viewWillAppear方法执行完后,由系统调用

这里写图片描述

6、懒加载(延迟加载)

用点语法容易出错,建议用”_”,如:

-(NSMutableArray* )operandStack{               //延迟实例化               if(_operandStack==nil){                              _operandStack=[[NSMutableArray alloc]init];               }               return _operandStack;}

6.1、在需要的时候才加载(效率低,占用内存小)。所谓懒加载,写的是其get方法。(懒加载只加载一次,一定要先判断属性是否为空,为空才执行逻辑,否则直接返回这个属性

6.2、
好处一:不必将创建对象的代码全部写在ViewDidLoad方法中,代码的可读性更强。
好处二:每个控件的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性更强,松耦合
好处三:加载过了就不会再次加载,节约了资源。
好处四:对于开发过程中可能会遇到的顺序问题,懒加载也可以很好的解决。

【松耦合:松耦合系统通常是基于消息的系统,此时客户端和远程服务并不知道对方是如何实现的。客户端和服务之间的通讯由消息的架构支配。只要消息符合协商的架构,则客户端或服务的实现就可以根据需要进行更改,而不必担心会破坏对方。】

简单梳理:

1、-[ViewController initWithCoder:]-[ViewController initWithNibName:Bundle]:首先从归档文件中加载UIViewController对象。即使是纯代码,也会把nil作为参数传给后者。
2、-[ViewController awakeFromNib]:作为第一个方法的助手,方便处理一些额外的设置。
3、-[ViewController loadView]:创建或加载一个view并把它赋值给UIViewController的view属性
4、-[ViewController viewDidLoad]:此时整个视图层次(view hierarchy)已经被放到内存中,可以移除一些视图,修改约束,加载数据等
5、-[ViewController viewWillAppear:]:视图加载完成,并即将显示在屏幕上,还没有设置动画,可以改变当前屏幕方向或状态栏的风格等。
6、-[ViewController viewWillLayoutSubviews]:即将开始子视图位置布局
7、-[ViewController viewDidLayoutSubviews]:用于通知视图的位置布局已经完成
8、-[ViewController viewDidAppear:]:视图已经展示在屏幕上,可以对视图做一些关于展示效果方面的修改。
9、-[ViewController viewWillDisappear:]:视图即将消失
10、-[ViewController viewDidDisappear:]:视图已经消失

如果考虑UIViewController可能在某个时刻释放整个view。那么再次加载视图时显然会从步骤3开始。因为此时的UIViewController对象依然存在。

参考链接:
UIView生命周期详解

创建控制器的方法、控制器加载view过程、控制器view的生命周期、多控制器组合

原创粉丝点击