iOS——ViewController的生命周期
引言
本文旨在对UIViewController从产生到消亡的过程进行深入探讨,并以此来明确UIViewController的生命周期。
ViewController
UIViewController作为iOS应用的核心组件,在数据管理和视图交互中扮演关键角色。它不仅负责整合并协调各个功能模块的展示,还通过复杂的逻辑实现不同界面元素之间的无缝切换与交互响应。苹果提供的SDK包含多种标准UIViewController实现,如表视图控制器(UIleep),导航控制器(UINavigationController)以及标签栏控制器($UITabBar)等标准界面组件,并旨在满足开发者对常见界面元素的需求
按结构可以对iOS的所有ViewController分成两类:
- 主要用于展示内容的ViewController,这种ViewController主要用于为用户展示内容,并与用户交互,如
UITableViewController,UIViewController。 - 用于控制和显示其他ViewController的ViewController。这种ViewController一般都是一个ViewController的容器。如
UINavigationController,UITabbarController。它们都有一个属性:viewControllers。其中UINavigationController表示一种Stack式结构,push或pop一个ViewController,后一个ViewController会依赖前一个ViewController。而UITabbarController表示一个Array结构,各个ViewController是并列的。
ViewController的生命周期

- (void) awakeFromNib
如果由XIB创建一个view,则该view会执行awfonyloaded方法。这个动作发生在当XIB或storyboard完全加载完毕时。在该状态下,nib文件中的相关对象已完成初始化,并且frame的位置已被固定。
- (void) loadView
用于生成Controller的视图。每当访问controller的view属性(如controller.view或self.view)时,并且该属性值为nil时,loadView方法会被激活。通常情况下,在整个ViewController生命周期中,loadView方法只会被激活一次。
- (void) viewDidLoad
在视图控制器完成对视图层次结构的加载后会触发该操作。无论这些层次结构是通过NIB文件导入还是通过代码方式生成都会导致此操作执行。当开发者在代码中手动创建一个新的视图加载器时,则会在其loadView方法结束后立即被触发;而如果该页面来自NIB文件中的布局设置,则会在布局设置完成后进行相应的处理。
- (void) viewWillAppear:(BOOL)animated
通知视图控制器其视图即将添加到视图层次结构中。
- (void) viewWillLayoutSubViews
通知视图控制器其视图将要布局它的子视图。
- (void) viewDidLayoutSubViews
通知视图控制器其视图已将其子视图布局好。
- (void) viewDidApper:(BOOL)animated
通知视图控制器其视图已经添加到视图层次结构中。
- (void) viewWillDisappear:(BOOL)animated
通知视图控制器其视图将要从视图层次结构中删除。
- (void) viewDidDisappear:(BOOL)animated
通知视图控制器其视图已经从视图层次结构中删除。
- (void) didReceiveMemoryWarning
当应用收到内存警告时会调用此方法。
demo
该应用实现了两套UIViewController的交互:一个是Main\Controller和另一个是Secondary\Controller。在Main\Controller中可以访问Secondary\Controller,在Secondary\Controller中则可以退出Main\Controller。
//ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
//ViewController.m
#import "ViewController.h"
#import "SecondViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor redColor];
UIButton *presentButton = [UIButton buttonWithType:UIButtonTypeSystem];
presentButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[presentButton addTarget:self action:@selector(present:) forControlEvents:UIControlEventTouchUpInside];
[presentButton setTitle:@"跳转" forState:UIControlStateNormal];
presentButton.frame = CGRectMake(150, 300, 100, 100);
[self.view addSubview:presentButton];
}
- (void)present:(UIButton *)button {
SecondViewController *secondViewController = [[SecondViewController alloc] init];
secondViewController.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:secondViewController animated:YES completion:nil];
}
@end
//SecondViewController.h
#import <UIKit/UIKit.h>
@interface SecondViewController : UIViewController
@property(nonatomic, strong)UIButton *dismissButton;
@end
//SecondViewController.m
#import "SecondViewController.h"
@interface SecondViewController ()
@end
@implementation SecondViewController
#pragma mark init
- (instancetype)init{
self = [super init];
if(self){
NSLog(@"%s",__func__);
}
return self;
}
#pragma mark loadView
- (void)loadView {
[super loadView];
NSLog(@"%s",__func__);
}
#pragma mark viewDidLoad
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
_dismissButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[_dismissButton addTarget:self action:@selector(dismiss:) forControlEvents:UIControlEventTouchUpInside];
[_dismissButton setTitle:@"返回" forState:UIControlStateNormal];
_dismissButton.frame = CGRectMake(150, 300, 100, 100);
[self.view addSubview:_dismissButton];
NSLog(@"%s",__func__);
}
#pragma mark viewWillLayoutSubviews
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
NSLog(@"%s",__func__);
}
#pragma mark viewDidLayoutSubviews
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
NSLog(@"%s",__func__);
}
#pragma mark viewWillAppear:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSLog(@"%s",__func__);
}
#pragma mark viewDidAppear:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
NSLog(@"%s",__func__);
}
#pragma mark viewWillDisappear:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillAppear:animated];
NSLog(@"%s",__func__);
}
#pragma mark viewDidDisappear:
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
NSLog(@"%s",__func__);
}
#pragma mark didReceiveMemoryWarning
- (void)didReceiveMemoryWarning {
NSLog(@"%s",__func__);
}
- (void)dismiss:(UIButton*)button {
[self dismissViewControllerAnimated:YES completion:nil];
}
@end
在SecondViewController中dismiss到ViewController后的运行结果:

