UIViewController的生命周期及iOS程序执行顺序
上文章篇介绍了iOS应用程序的消息处理机制,本篇主要介绍iOS开发中的视图控制器的生命周期,这是iOS开发中的重点。
上一篇:
A页面 -> B页面: - A viewDidLoad - A viewWillAppear - A viewDidAppear - B viewDidLoad - A viewWillDisappear - B viewWillAppear - A viewDidDispaaear - B viewDidiAppear B -> A - B viewWillDisappear - A viewWillAppear - B viewDidDisappear - A viewDidAppear 一般Avc跳转到Bvc,正常情况下Bvc返回Avc的时候是不调用A的viewdidload的,是因为Avc这个对象还存在内存中,它的view以及subviews也都还存在内存中,所以系统没有执行A的loadview方法,也就没有执行A的viewdidload方法。那么有时候情况是这样的,Avc跳转到了Bvc,这时候出现了设备内存不足的警告, 也就是viewController会收到didReceiveMemoryWarning的消息。系统会默认释放掉不在当前使用的view hierarchy的视图,也就是Avc的view及其subview被释放了。那么Bvc返回到Avc的时候就,Avc首先要调用loadview去创建一个有效的view,在调用viewdidload来进行其他subview的初始化。
当一个视图控制器被创建,并在屏幕上面显示的时候,代码的执行顺序:
- alloc
- init(initWithNibName)
- loadView
- viewDidLoad
- viewwillAppear
- viewDidAppear
- alloc
当一个视图被移除屏幕并且销毁的时候,执行顺序相反:
- viewWillDisappear
- viewDidDispatch
- dealloc
UIViewController类对象方法,(后四种有动画,返回值Bool类型)
- viewDidLoad
- viewDidUnload
- viewWillAppear
- viewDidAppear
- viewWillDisappear
- viewDidDisappear
APP在运行时的调用顺序
- viewDidLoad
- 我们对于各种初始数据的载入,初始设定等很多内容,都会在这个方法中实现
- 个方法只会在APP刚开始加载的时候调用一次,以后都不会再调用它了,所以只能用来做初始设置。
- viewDidUnload
- 在内存足够的情况下,软件的视图通常会一直保存在内存中,但是如果内存不够,一些没有正在显示的viewcontroller就会收到内存不够的警告,然后就会释放自己拥有的视图,以达到释放内存的目的。但是系统只会释放内存,并不会释放对象的所有权,所以通常我们需要在这里将不需要在内存中保留的对象释放所有权,也就是将其指针置为nil。
- 这个方法通常并不会在视图变换的时候被调用,而只会在系统退出或者收到内存警告的时候才会被调用。但是由于我们需要保证在收到内存警告的时候能够对其作出反应,所以这个方法通常我们都需要去实现
- 即使在设备上按了Home键之后,系统也不一定会调用这个方法
- viewWillAppear(非常常用)
- 系统在载入所有数据后,将会在屏幕上显示视图,这时会先调用这个方法。通常我们会利用这个方法,对即将显示的视图做进一步的设置。例如,我们可以利用这个方法来设置设备不同方向时该如何显示。
- 当APP有多个视图时,在视图间切换时,并不会再次载入viewDidLoad方法,所以如果在调入视图时,需要对数据做更新,就只能在这个方法内实现了。
- viewDidAppear
- 有时候,由于一些特殊的原因,我们不能在viewWillApper方法里,对视图进行更新。那么可以重写这个方法,在这里对正在显示的视图进行进一步的设置
- viewWillDisappear
- 视图即将移除,覆盖,调用这个方法进行善后处理和设置
- 系统允许将APP在后台挂起,所以在按了Home键之后,系统并不会调用这个方法,因为就这个APP本身而言,APP显示的view,仍是挂起时候的view,所以并不会调用这个方法
- viewDidDispear
- 对已经消失,覆盖,隐藏的视图做操作
- viewDidLoad
运行APP —> 载入视图 —> 调用viewDidLoad方法 —> 调用viewWillAppear方法 —> 调用viewDidAppear方法 —> 正常运行
- IOS 开发 loadView 和 viewDidLoad 的区别
- viewDidload只有当view从nib文件初始化的时候才被调用
- loadView 在控制器的view为nil的时候被调用。 此方法用于以编程的方式创建view的时候用到
你在控制器中实现了loadView方法,那么你可能会在应用运行的某个时候被内存管理控制调用; 设备内存不足的时候, view 控制器会收到didReceiveMemoryWarning的消息; 默认的实现是检查当前控制器的view是否在使用。如果它的view不在当前正在使用的view hierarchy里面,且你的控制器实现了loadView方法,那么这个view将被release, loadView方法将被再次调用来创建一个新的view。 系统会在内存不足时调用viewDidUnload,再次展示该页面时,还会调用viewDidLoad
下一篇: