UIViewController的生命周期比較簡單,整個流程調(diào)用代碼順序如下:
initWithNibName:bundle: 初始化UIViewController,執(zhí)行關(guān)鍵數(shù)據(jù)初始化操作,非StoryBoard創(chuàng)建UIViewController都會調(diào)用這個方法.
initWithCoder: 如果通過StoryBoard進行視圖管理,程序不會直接初始化一個UIViewController,StoryBoard會自動初始化或在segue被觸發(fā)時自動初始化,因此方法initWithNibName:bundle不會被調(diào)用,但是initWithCoder會被調(diào)用。
loadView :當訪問UIViewController的View屬性時,View如果此時為nil,那么ViewController會自動調(diào)用loadView方法來初始化一個UIView并賦值給UIViewController的View;如果沒有重載lodaView方法,則UIViewController會從nib或StoryBoard中查找默認的loadView,默認的loadView會返回一個空白的UIView對象.
viewDidLoad:當loadView將view載入內(nèi)存中,可以對加載網(wǎng)絡(luò)數(shù)據(jù),視圖的UI初始化.
viewWillAppear:系統(tǒng)在載入所有的數(shù)據(jù)后,在視圖展示之前還可以進行進一步的調(diào)整(比如設(shè)置狀態(tài)欄方向).
viewWillLayoutSubviews:view 即將布局其Subviews.
viewDidLayoutSubviews:view已經(jīng)布局其Subviews.
viewDidAppear:視圖完全展示在界面之前最后的調(diào)整.
viewWillDisappear:在視圖切換是,當前視圖在即將被移除、或被覆蓋是,此時還沒有調(diào)用removeFromSuperview。
viewDidDisappear:view已經(jīng)消失或被覆蓋,此時已經(jīng)調(diào)用removeFromSuperView;
dealloc:視圖被銷毀.
didReceiveMemoryWarning:在內(nèi)存足夠的情況下,app的視圖通常會一直保存在內(nèi)存中,但是如果內(nèi)存不夠,一些沒有正在顯示的viewController就會收到內(nèi)存不夠的警告,然后就會釋放自己擁有的視圖,以達到釋放內(nèi)存的目的。但是系統(tǒng)只會釋放內(nèi)存,并不會釋放對象的所有權(quán),所以通常我們需要在這里將不需要顯示在內(nèi)存中保留的對象釋放它的所有權(quán),將其指針置nil。
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
NSLog(@"FlyElephant---%s", __FUNCTION__);
}
return self;
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
NSLog(@"FlyElephant---%s", __FUNCTION__);
if (self = [super initWithCoder:aDecoder]) {
NSLog(@"FlyElephant---%s", __FUNCTION__);
}
return self;
}
- (void)loadView {
[super loadView];
NSLog(@"FlyElephant---%s", __FUNCTION__);
self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.view.backgroundColor = [UIColor greenColor];
}
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"FlyElephant--%s", __FUNCTION__);
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSLog(@"FlyElephant--%s", __FUNCTION__);
}
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
NSLog(@"FlyElephant--%s", __FUNCTION__);
}
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
NSLog(@"FlyElephant--%s", __FUNCTION__);
}
- (void)viewDidAppear:(BOOL)animated {
NSLog(@"%s", __FUNCTION__);
[super viewDidAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
NSLog(@"FlyElephant--%s", __FUNCTION__);
}
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
NSLog(@"FlyElephant--%s", __FUNCTION__);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
NSLog(@"FlyElephant--%s", __FUNCTION__);
}
- (void)dealloc {
NSLog(@"%s", __FUNCTION__);
}
非StoryBoard中控制器加載過程:
StoryBoard中控制器加載過程: