iOS-UIViewController生命周期

UIViewController的生命周期比較簡單,整個流程調(diào)用代碼順序如下:

  1. initWithNibName:bundle: 初始化UIViewController,執(zhí)行關(guān)鍵數(shù)據(jù)初始化操作,非StoryBoard創(chuàng)建UIViewController都會調(diào)用這個方法.

  2. initWithCoder: 如果通過StoryBoard進行視圖管理,程序不會直接初始化一個UIViewController,StoryBoard會自動初始化或在segue被觸發(fā)時自動初始化,因此方法initWithNibName:bundle不會被調(diào)用,但是initWithCoder會被調(diào)用。

  3. loadView :當訪問UIViewController的View屬性時,View如果此時為nil,那么ViewController會自動調(diào)用loadView方法來初始化一個UIView并賦值給UIViewController的View;如果沒有重載lodaView方法,則UIViewController會從nib或StoryBoard中查找默認的loadView,默認的loadView會返回一個空白的UIView對象.

  4. viewDidLoad:當loadView將view載入內(nèi)存中,可以對加載網(wǎng)絡(luò)數(shù)據(jù),視圖的UI初始化.

  5. viewWillAppear:系統(tǒng)在載入所有的數(shù)據(jù)后,在視圖展示之前還可以進行進一步的調(diào)整(比如設(shè)置狀態(tài)欄方向).

  6. viewWillLayoutSubviews:view 即將布局其Subviews.

  7. viewDidLayoutSubviews:view已經(jīng)布局其Subviews.

  8. viewDidAppear:視圖完全展示在界面之前最后的調(diào)整.

  9. viewWillDisappear:在視圖切換是,當前視圖在即將被移除、或被覆蓋是,此時還沒有調(diào)用removeFromSuperview。

  10. viewDidDisappear:view已經(jīng)消失或被覆蓋,此時已經(jīng)調(diào)用removeFromSuperView;

  11. dealloc:視圖被銷毀.

  12. 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中控制器加載過程:


FlyElephant.png

StoryBoard中控制器加載過程:


FlyElephant.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容