iOS - UIViewController生命周期(storyboard/Xib/純代碼)

一. 代碼測試思路

創(chuàng)建三個UIViewController,第一個storyboard創(chuàng)建,第二個Xib創(chuàng)建,第三個純代碼創(chuàng)建,分別為:BoardInitViewController,XibInitViewController,CodeInitViewController, 這個三個vc通過導(dǎo)航模式交互,在vc中把所有跟初始化相關(guān)的放大實現(xiàn)并打印

BoardInitViewController.m
//
//  BoardInitViewController.m
//  ControllerLifeCycle
//
//  Created by Ternence on 2021/4/29.
//

#import "BoardInitViewController.h"
#import "CodeInitViewController.h"

@interface BoardInitViewController ()

@end

@implementation BoardInitViewController

+ (void)load {
    [super load];
    NSLog(@"boardVC------%s", __func__);
}

+ (void)initialize {
    [super initialize];
    NSLog(@"boardVC------%s", __func__);
}

+ (instancetype)alloc {
    NSLog(@"boardVC------%s", __func__);
    return  [super alloc];
}

- (nullable instancetype)initWithCoder:(NSCoder *)coder {
    NSLog(@"boardVC------%s", __func__);
    return [super initWithCoder:coder];
}

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    NSLog(@"boardVC------%s", __func__);
    return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
}

- (instancetype)init {
    NSLog(@"boardVC------%s", __func__);
    return [super init];
}

- (void)loadView {
    [super loadView];
    NSLog(@"boardVC------%s", __func__);
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"boardVC------%s", __func__);
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"boardVC------%s", __func__);
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"boardVC------%s", __func__);
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    NSLog(@"boardVC------%s", __func__);
}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"boardVC------%s", __func__);
    self.view.backgroundColor = [UIColor lightTextColor];
}

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
    NSLog(@"boardVC------%s", __func__);
}

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    NSLog(@"boardVC------%s", __func__);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    NSLog(@"boardVC------%s", __func__);
}

- (void)dealloc {
    NSLog(@"boardVC------%s", __func__);
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    
    CodeInitViewController *vc = [[ CodeInitViewController alloc]init];
    [self.navigationController pushViewController:vc animated:YES];
}

@end

XibInitViewController.m
//
//  XibInitViewController.m
//  ControllerLifeCycle
//
//  Created by Ternence on 2021/4/29.
//

#import "XibInitViewController.h"

@interface XibInitViewController ()

@end

@implementation XibInitViewController

+ (void)load {
    [super load];
    NSLog(@"XibVC------%s", __func__);
}

+ (void)initialize {
    [super initialize];
    NSLog(@"XibVC------%s", __func__);
}

+ (instancetype)alloc {
    NSLog(@"XibVC------%s", __func__);
    return  [super alloc];
}

- (nullable instancetype)initWithCoder:(NSCoder *)coder {
    NSLog(@"XibVC------%s", __func__);
    return [super initWithCoder:coder];
}

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    NSLog(@"XibVC------%s", __func__);
    return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
}

- (instancetype)init {
    NSLog(@"XibVC------%s", __func__);
    return [super init];
}

- (void)loadView {
    [super loadView];
    NSLog(@"XibVC------%s", __func__);
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"XibVC------%s", __func__);
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"XibVC------%s", __func__);
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"XibVC------%s", __func__);
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    NSLog(@"XibVC------%s", __func__);
}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"XibVC------%s", __func__);
    self.view.backgroundColor = [UIColor blueColor];
}

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
    NSLog(@"XibVC------%s", __func__);
}

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    NSLog(@"XibVC------%s", __func__);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    NSLog(@"XibVC------%s", __func__);
}

- (void)dealloc {
    NSLog(@"XibVC------%s", __func__);
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    
}

@end

CodeInitViewController.m
//
//  CodeInitViewController.m
//  ControllerLifeCycle
//
//  Created by Ternence on 2021/4/29.
//

#import "CodeInitViewController.h"
#import "XibInitViewController.h"

@interface CodeInitViewController ()

@end

@implementation CodeInitViewController

+ (void)load {
    [super load];
    NSLog(@"CodeVC------%s", __func__);
}

+ (void)initialize {
    [super initialize];
    NSLog(@"CodeVC------%s", __func__);
}

+ (instancetype)alloc {
    NSLog(@"CodeVC------%s", __func__);
    return  [super alloc];
}

- (nullable instancetype)initWithCoder:(NSCoder *)coder {
    NSLog(@"CodeVC------%s", __func__);
    return [super initWithCoder:coder];
}

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    NSLog(@"CodeVC------%s", __func__);
    return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
}

- (instancetype)init {
    NSLog(@"CodeVC------%s", __func__);
    return [super init];
}

- (void)loadView {
    [super loadView];
    NSLog(@"CodeVC------%s", __func__);
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"CodeVC------%s", __func__);
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"CodeVC------%s", __func__);
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"CodeVC------%s", __func__);
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    NSLog(@"CodeVC------%s", __func__);
}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"CodeVC------%s", __func__);
    self.view.backgroundColor = [UIColor redColor];
}

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
    NSLog(@"CodeVC------%s", __func__);
}

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    NSLog(@"CodeVC------%s", __func__);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    NSLog(@"CodeVC------%s", __func__);
}

- (void)dealloc {
    NSLog(@"CodeVC------%s", __func__);
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    XibInitViewController *vc = [[ XibInitViewController alloc]init];
    [self.navigationController pushViewController:vc animated:YES];
}

@end

二. 方法說明

load   程序啟動后,在main函數(shù)調(diào)用之前,系統(tǒng)會加載所有l(wèi)oad方法,提前進行一些資源包配置或hook
initialize  當前類或其子類未被初始化過時會首次調(diào)用,若以后當前類或其子類再次初始化不會再調(diào)用,一般提前為初始化做一些工作
alloc  系統(tǒng)為當前類分配內(nèi)存時調(diào)用,在C語言中就是malloc這一步
initWithCoder 通過storyboard方式實例化的vc,需要經(jīng)過反序列化,這個方法會被調(diào)用,其他不會調(diào)用
initWithNibName:bundle:   通過Xib或init方法實例化的vc,這個方法都會被調(diào)用,其實init方法最終都會走該方法
init  通過純代碼實例化的vc會調(diào)用,最終會走initWithNibName:bundle
loadView  實例化vc后,可以加載一些系統(tǒng)常規(guī)view
viewDidLoad  一般加載自定義view或初始化熟悉,視圖加載完畢后會調(diào)用
viewWillDisappear:  視圖即將出現(xiàn)調(diào)用
viewDidAppear: 視圖已經(jīng)出現(xiàn)會調(diào)用
viewWillDisappear:  視圖即將消失調(diào)用
viewDidDisappear:  視圖已經(jīng)消失調(diào)用
viewWillLayoutSubviews  視圖加載完畢后將要布局
viewDidLayoutSubviews  視圖加載完畢后布局也完成了
didReceiveMemoryWarning  加載視圖時,內(nèi)存消耗太大,出現(xiàn)內(nèi)存警告會調(diào)用  
dealloc  實例化被銷毀,運行內(nèi)存的回收會調(diào)用

三. Debug log

  1. 程序啟動,加載storyboard實例化BoardInitViewController
2021-04-29 18:33:07.317496+0800 ControllerLifeCycle[6270:5044336] XibVC------+[XibInitViewController load]
2021-04-29 18:33:07.319472+0800 ControllerLifeCycle[6270:5044336] boardVC------+[BoardInitViewController load]
2021-04-29 18:33:07.319605+0800 ControllerLifeCycle[6270:5044336] CodeVC------+[CodeInitViewController load]
2021-04-29 18:33:07.369674+0800 ControllerLifeCycle[6270:5044336] boardVC------+[BoardInitViewController initialize]
2021-04-29 18:33:07.369789+0800 ControllerLifeCycle[6270:5044336] boardVC------+[BoardInitViewController alloc]
2021-04-29 18:33:07.369918+0800 ControllerLifeCycle[6270:5044336] boardVC-------[BoardInitViewController initWithCoder:]
2021-04-29 18:33:07.410110+0800 ControllerLifeCycle[6270:5044336] boardVC-------[BoardInitViewController loadView]
2021-04-29 18:33:07.410246+0800 ControllerLifeCycle[6270:5044336] boardVC-------[BoardInitViewController viewDidLoad]
2021-04-29 18:33:07.410867+0800 ControllerLifeCycle[6270:5044336] boardVC-------[BoardInitViewController viewWillAppear:]
2021-04-29 18:33:07.412541+0800 ControllerLifeCycle[6270:5044336] boardVC-------[BoardInitViewController viewWillLayoutSubviews]
2021-04-29 18:33:07.412663+0800 ControllerLifeCycle[6270:5044336] boardVC-------[BoardInitViewController viewDidLayoutSubviews]
2021-04-29 18:33:07.418158+0800 ControllerLifeCycle[6270:5044336] boardVC-------[BoardInitViewController viewDidAppear:]
  1. BoardInitViewController中push到純代碼實例化的CodeInitViewController
2021-04-29 18:34:45.194133+0800 ControllerLifeCycle[6270:5044336] CodeVC------+[CodeInitViewController initialize]
2021-04-29 18:34:45.194269+0800 ControllerLifeCycle[6270:5044336] CodeVC------+[CodeInitViewController alloc]
2021-04-29 18:34:45.194399+0800 ControllerLifeCycle[6270:5044336] CodeVC-------[CodeInitViewController init]
2021-04-29 18:34:45.194518+0800 ControllerLifeCycle[6270:5044336] CodeVC-------[CodeInitViewController initWithNibName:bundle:]
2021-04-29 18:34:45.200030+0800 ControllerLifeCycle[6270:5044336] CodeVC-------[CodeInitViewController loadView]
2021-04-29 18:34:45.200188+0800 ControllerLifeCycle[6270:5044336] CodeVC-------[CodeInitViewController viewDidLoad]
2021-04-29 18:34:45.200374+0800 ControllerLifeCycle[6270:5044336] boardVC-------[BoardInitViewController viewWillDisappear:]
2021-04-29 18:34:45.200515+0800 ControllerLifeCycle[6270:5044336] CodeVC-------[CodeInitViewController viewWillAppear:]
2021-04-29 18:34:45.220143+0800 ControllerLifeCycle[6270:5044336] CodeVC-------[CodeInitViewController viewWillLayoutSubviews]
2021-04-29 18:34:45.220331+0800 ControllerLifeCycle[6270:5044336] CodeVC-------[CodeInitViewController viewDidLayoutSubviews]
2021-04-29 18:34:45.744908+0800 ControllerLifeCycle[6270:5044336] boardVC-------[BoardInitViewController viewDidDisappear:]
2021-04-29 18:34:45.745100+0800 ControllerLifeCycle[6270:5044336] CodeVC-------[CodeInitViewController viewDidAppear:]
  1. CodeInitViewController中push到Xib實例化的XibInitViewController
2021-04-29 18:35:29.448921+0800 ControllerLifeCycle[6270:5044336] XibVC------+[XibInitViewController initialize]
2021-04-29 18:35:29.449069+0800 ControllerLifeCycle[6270:5044336] XibVC------+[XibInitViewController alloc]
2021-04-29 18:35:29.449190+0800 ControllerLifeCycle[6270:5044336] XibVC-------[XibInitViewController init]
2021-04-29 18:35:29.449288+0800 ControllerLifeCycle[6270:5044336] XibVC-------[XibInitViewController initWithNibName:bundle:]
2021-04-29 18:35:29.450580+0800 ControllerLifeCycle[6270:5044336] XibVC-------[XibInitViewController loadView]
2021-04-29 18:35:29.450757+0800 ControllerLifeCycle[6270:5044336] XibVC-------[XibInitViewController viewDidLoad]
2021-04-29 18:35:29.450920+0800 ControllerLifeCycle[6270:5044336] CodeVC-------[CodeInitViewController viewWillDisappear:]
2021-04-29 18:35:29.451058+0800 ControllerLifeCycle[6270:5044336] XibVC-------[XibInitViewController viewWillAppear:]
2021-04-29 18:35:29.460843+0800 ControllerLifeCycle[6270:5044336] XibVC-------[XibInitViewController viewWillLayoutSubviews]
2021-04-29 18:35:29.460981+0800 ControllerLifeCycle[6270:5044336] XibVC-------[XibInitViewController viewDidLayoutSubviews]
2021-04-29 18:35:29.963047+0800 ControllerLifeCycle[6270:5044336] CodeVC-------[CodeInitViewController viewDidDisappear:]
2021-04-29 18:35:29.963345+0800 ControllerLifeCycle[6270:5044336] XibVC-------[XibInitViewController viewDidAppear:]
  1. XibInitViewControllerPop到CodeInitViewController
2021-04-29 18:36:28.460722+0800 ControllerLifeCycle[6270:5044336] XibVC-------[XibInitViewController viewWillDisappear:]
2021-04-29 18:36:28.460881+0800 ControllerLifeCycle[6270:5044336] CodeVC-------[CodeInitViewController viewWillAppear:]
2021-04-29 18:36:28.971655+0800 ControllerLifeCycle[6270:5044336] XibVC-------[XibInitViewController viewDidDisappear:]
2021-04-29 18:36:28.971818+0800 ControllerLifeCycle[6270:5044336] CodeVC-------[CodeInitViewController viewDidAppear:]
2021-04-29 18:36:28.972008+0800 ControllerLifeCycle[6270:5044336] XibVC-------[XibInitViewController dealloc]
  1. CodeInitViewControllerPop到BoardInitViewController
2021-04-29 18:37:09.095856+0800 ControllerLifeCycle[6270:5044336] CodeVC-------[CodeInitViewController viewWillDisappear:]
2021-04-29 18:37:09.095988+0800 ControllerLifeCycle[6270:5044336] boardVC-------[BoardInitViewController viewWillAppear:]
2021-04-29 18:37:09.599896+0800 ControllerLifeCycle[6270:5044336] CodeVC-------[CodeInitViewController viewDidDisappear:]
2021-04-29 18:37:09.600184+0800 ControllerLifeCycle[6270:5044336] boardVC-------[BoardInitViewController viewDidAppear:]
2021-04-29 18:37:09.600453+0800 ControllerLifeCycle[6270:5044336] CodeVC-------[CodeInitViewController dealloc]

四. 總結(jié)

1.main函數(shù)加載前,先加載所有controller的+load方法,其中順序是:Xib-> Storyboard->Code

  1. 控制器初始化流程是:初始化A->加載視圖A->將要顯示A->將要布局A->布局A完成->已經(jīng)顯示A
  2. 控制器A Push B生命流程:初始化B->加載B->A將要消失->B將要顯示->B將要布局->B已經(jīng)布局->A已經(jīng)消失->B已經(jīng)顯示
  3. 只有通過storyboard創(chuàng)建的vc才會調(diào)用initWithCoder,不會調(diào)用initWithNibName:bundle:
  4. 調(diào)用了init方法的vc(xib或純代碼),最終會調(diào)用initWithNibName:bundle:
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容