首页 > 代码库 > UIViewController的生命周期及iOS程序运行顺序

UIViewController的生命周期及iOS程序运行顺序

当一个视图控制器被创建,并在屏幕上显示的时候。 代码的运行顺序
1、 alloc                                   创建对象,分配空间
2、init (initWithNibName) 初始化对象,初始化数据
3、loadView                          从nib加载视图 ,通常这一步不须要去干涉。除非你没有使用xib文件创建视图
4、viewDidLoad                   加载完毕。能够进行自己定义数据以及动态创建其它控件
5、viewWillAppear              视图将出如今屏幕之前,立即这个视图就会被展如今屏幕上了
6、viewDidAppear               视图已在屏幕上渲染完毕

当一个视图被移除屏幕而且销毁的时候的运行顺序。这个顺序几乎相同和上面的相反
1、viewWillDisappear            视图将被从屏幕上移除之前运行
2、viewDidDisappear             视图已经被从屏幕上移除,用户看不到这个视图了
3、dealloc                                 视图被销毁。此处须要对你在init和viewDidLoad中创建的对象进行释放

关于viewDidUnload :在发生内存警告的时候假设本视图不是当前屏幕上正在显示的视图的话, viewDidUnload将会被运行,本视图的全部子视图将被销毁。以释放内存,此时开发人员须要手动对viewLoad、viewDidLoad中创建的对象释放内存。 由于当这个视图再次显示在屏幕上的时候,viewLoad、viewDidLoad 再次被调用。以便再次构造视图。

当我们创建一个UIViewController类的对象时,通常系统会生成几个默认的方法,这些方法大多与视图的调用有关,可是在视图调用时。这些方法的调用顺序怎样,须要整理下。

通常上述方法包含例如以下几种。这些方法都是UIViewController类的方法:

- (void)viewDidLoad。

- (void)viewDidUnload;

- (void)viewWillAppear:(BOOL)animated;

- (void)viewDidAppear:(BOOL)animated。

- (void)viewWillDisappear:(BOOL)animated。

- (void)viewDidDisappear:(BOOL)animated;

 

以下介绍下APP在执行时的调用顺序。

1)- (void)viewDidLoad。

      一个APP在加载时会先通过调用loadView方法或者加载IB中创建的初始界面的方法,将视图加载到内存中。然后会调用viewDidLoad方法来进行进一步的设置。通常。我们对于各种初始数据的加载。初始设定等非常多内容。都会在这种方法中实现。所以这种方法是一个非经常常使用,非常重要的方法。

      可是要注意,这种方法仅仅会在APP刚開始载入的时候调用一次,以后都不会再调用它了,所以仅仅能用来做初始设置。

2) - (void)viewDidUnload;

      在内存足够的情况下。软件的视图一般会一直保存在内存中,可是假设内存不够。一些没有正在显示的viewcontroller就会收到内存不够的警告,然后就会释放自己拥有的视图,以达到释放内存的目的。可是系统仅仅会释放内存,并不会释放对象的全部权,所以通常我们须要在这里将不须要在内存中保留的对象释放全部权,也就是将其指针置为nil。

      这种方法通常并不会在视图变换的时候被调用,而仅仅会在系统退出或者收到内存警告的时候才会被调用。

可是因为我们须要保证在收到内存警告的时候可以对其作出反应。所以这种方法通常我们都须要去实现。

      另外,即使在设备上按了Home键之后。系统也不一定会调用这种方法,由于IOS4之后,系统同意将APP在后台挂起。并将其继续滞留在内存中。因此,viewcontroller并不会调用这种方法来清除内存。

3)- (void)viewWillAppear:(BOOL)animated;

      系统在加载全部数据后。将会在屏幕上显示视图,这时会先调用这种方法。

通常我们会利用这种方法,对即将显示的视图做进一步的设置。比如。我们能够利用这种方法来设置设备不同方向时该怎样显示。

      另外一方面,当APP有多个视图时。在视图间切换时。并不会再次加载viewDidLoad方法,所以假设在调入视图时。须要对数据做更新,就仅仅能在这种方法内实现了。

所以这种方法也很经常使用。

4) - (void)viewDidAppear:(BOOL)animated;

      有时候,因为一些特殊的原因,我们不能在viewWillApper方法里。对视图进行更新。

那么能够重写这种方法,在这里对正在显示的视图进行进一步的设置。

5) - (void)viewWillDisappear:(BOOL)animated。

      在视图变换时,当前视图在即将被移除、或者被覆盖时。会调用这种方法进行一些善后的处理和设置。

      由于在IOS4之后。系统同意将APP在后台挂起,所以在按了Home键之后。系统并不会调用这种方法。由于就这个APP本身而言。APP显示的view,仍是挂起时候的view,所以并不会调用这种方法。

6) - (void)viewDidDisappear:(BOOL)animated。

      我们能够重写这种方法。对已经消失,或者被覆盖,或者已经隐藏了的视图做一些其它操作。



IOS 开发 loadView 和 viewDidLoad 的差别

iPhone开发不可缺少的要用到这两个方法。 他们都能够用来在视图加载的时候。初始化一些内容。 可是他们有什么差别呢?

viewDidLoad 此方法仅仅有当view从nib文件初始化的时候才被调用。

loadView 此方法在控制器的view为nil的时候被调用。 此方法用于以编程的方式创建view的时候用到。

如:

  1.  
  2. - ( void ) loadView {
  3.     UIView *view = [ [ UIView alloc] initWithFrame:[ UIScreen
  4. mainScreen] .applicationFrame] ;
  5.     [ view setBackgroundColor:_color] ;
  6.     self.view = view;
  7.     [ view release] ;
  8. }
  9.  

你在控制器中实现了loadView方法。那么你可能会在应用执行的某个时候被内存管理控制调用。

假设设备内存不足的时候, view 控制器会收到didReceiveMemoryWarning的消息。

默认的实现是检查当前控制器的view是否在使用。

假设它的view不在当前正在使用的view hierarchy里面,且你的控制器实现了loadView方法。那么这个view将被release, loadView方法将被再次调用来创建一个新的view。


UIViewController的生命周期及iOS程序运行顺序