UIViewController 生命周期

轉(zhuǎn)自:http://blog.csdn.net/zhz459880251/article/details/49003107

/**
初始化UIViewController,執(zhí)行關(guān)鍵數(shù)據(jù)初始化操作,注意這里不要做view相關(guān)操作,view在loadView方法中才初始化,這時(shí)loadView還未調(diào)用。
*/

/**
如果使用StoryBoard進(jìn)行視圖管理,程序不會(huì)直接初始化一個(gè)UIViewController,StoryBoard會(huì)自動(dòng)初始化或在segue被觸發(fā)時(shí)自動(dòng)初始化,因此方法initWithNibName:bundle:不會(huì)被調(diào)用。
*/
//1.如果用代碼創(chuàng)建, 調(diào)用

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nil bundle:nil]) {

    }
    return self;
}

/**
如果在代碼里面使用instantiateViewControllerWithIdentifier:方法顯示初始化一個(gè)UIViewController,則initWithCoder方法會(huì)被調(diào)用
*/
//1.如果用xib, 或 SB創(chuàng)建, 調(diào)用

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        NSLog(@"123");
    }
    return self;
}

/**
初始化view, 這時(shí)候調(diào)用self.view會(huì)無(wú)限循環(huán), 除非先調(diào)用了[supper loadView]
如果沒(méi)有重載loadView方法,則UIViewController會(huì)從nib或StoryBoard中查找默認(rèn)的loadView,默認(rèn)的loadView會(huì)返回一個(gè)空白的UIView對(duì)象。
如果重載loadView方法, 這需先調(diào)用[supper loadView], 否則控件不顯示
*/
//2.

- (void)loadView {
    [super loadView];
    self.view.backgroundColor = [UIColor grayColor];
}

/**
當(dāng)VC的view對(duì)象載入 內(nèi)存 后調(diào)用,用于對(duì)view進(jìn)行額外的初始化操作
*/
//3.

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor greenColor];
    self.myButton.backgroundColor = [UIColor greenColor];

}

/**
在view即將添加到視圖層級(jí)中(顯示給用戶(hù))且任意顯示動(dòng)畫(huà)切換之前調(diào)用(這個(gè)時(shí)候supperView還是nil)。這個(gè)方法中完成任何與視圖顯示相關(guān)的任務(wù),例如改變視圖方向、狀態(tài)欄方向、視圖顯示樣式等
*/
//4.

- (void)viewWillAppear:(BOOL)animated {
    self.view.backgroundColor = [UIColor redColor];
}

/**
view即將布局其Subviews。比如view的bounds改變了(例如狀態(tài)欄從不顯示到顯示,視圖方向變化),要調(diào)整Subviews的位置,在調(diào)整之前要做的一些工作就可以在該方法中實(shí)現(xiàn)。
*/
//5.

- (void)viewWillLayoutSubviews {
    //[super viewWillLayoutSubviews];
    self.myButton.backgroundColor = [UIColor colorWithRed:0.2 green:0.2 blue:0.8 alpha:1.0];
}

/**
view已經(jīng)布局其Subviews。比如view的bounds改變了(例如狀態(tài)欄從不顯示到顯示,視圖方向變化),已經(jīng)調(diào)整Subviews的位置,在調(diào)整完成之后要做的一些工作就可以在該方法中實(shí)現(xiàn)。
*/
//6.

- (void)viewDidLayoutSubviews {
    //[super viewDidLayoutSubviews];
    self.myButton.backgroundColor = [UIColor grayColor];
}

/**
在view被添加到視圖層級(jí)中,顯示動(dòng)畫(huà)切換之后調(diào)用(這時(shí)view已經(jīng)添加到supperView中)。在這個(gè)方法中執(zhí)行視圖顯示相關(guān)附件任務(wù),如果重載了這個(gè)方法,必須在方法中調(diào)用[supper viewDidAppear];
*/
//7.

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    self.view.backgroundColor = [UIColor blueColor];
}

//------------------------移除 視圖------------------------
/**
view即將從superView中移除且移除動(dòng)畫(huà)切換之前,此時(shí)還沒(méi)有調(diào)用removeFromSuperview。
*/
//1.

- (void)viewWillDisappear:(BOOL)animated {
    NSLog(@"%s ,%d", __FUNCTION__, __LINE__);
}

/**
view從superView中移除,移除動(dòng)畫(huà)切換之后調(diào)用,此時(shí)已調(diào)用removeFromSuperview。
*/
//2.在下一個(gè)視圖的viewWillAppear: 調(diào)用之后, viewDidAppear:調(diào)用之前才調(diào)用

- (void)viewDidDisappear:(BOOL)animated {
    NSLog(@"%s ,%d", __FUNCTION__, __LINE__);
}

ios6.0以后被廢棄

- (void)viewWillUnload {
    NSLog(@"%s ,%d", __FUNCTION__, __LINE__);
}

- (void)viewDidUnload {
    NSLog(@"%s ,%d", __FUNCTION__, __LINE__);
}

補(bǔ)充:

initWithNibName:bundle:
如果是通過(guò)調(diào)用initWithNibName:bundle指定nib文件名初始化的話,ViewController會(huì)根據(jù)此nib來(lái)創(chuàng)建View。如果name參數(shù)為nil,則ViewController會(huì)通過(guò)以下兩個(gè)步驟找到與其關(guān)聯(lián)的nib:

1)如果ViewController的類(lèi)名以“Controller”結(jié)尾,例如ViewController的類(lèi)名是MyViewController,則查找是否存在MyView.nib;
2)找跟ViewController類(lèi)名一樣的文件,例如MyViewController,則查找是否存在MyViewController.nib
loadView
當(dāng)訪問(wèn)UIViewController的view屬性時(shí),view如果此時(shí)是nil,那么VC會(huì)自動(dòng)調(diào)用loadView方法來(lái)初始化一個(gè)UIView并賦值給view屬性。此方法用在初始化關(guān)鍵view,需要注意的是,在view初始化之前,不能先調(diào)用view的getter方法,否則將導(dǎo)致死循環(huán)(除非先調(diào)用了[supper loadView];)。

-(void)loadView{

    NSLog(@"loadView");

    //錯(cuò)誤,將導(dǎo)致死循環(huán),因此此時(shí)view=nil,VC會(huì)再次調(diào)用loadView來(lái)初始化view
    self.view.backgroundColor=[UIColor greenColor];

}
-(void)loadView{
    NSLog(@"loadView");

    //正確,先初始化view
    self.view=[[MyView alloc]init];

    self.view.backgroundColor=[UIColor greenColor];

}

當(dāng)一個(gè)視圖被移除屏幕并且銷(xiāo)毀的時(shí)候的執(zhí)行順序,這個(gè)順序差不多和上面的相反
1、viewWillDisappear 視圖將被從屏幕上移除之前執(zhí)行
2、viewDidDisappear 視圖已經(jīng)被從屏幕上移除,用戶(hù)看不到這個(gè)視圖了
3、dealloc 視圖被銷(xiāo)毀,此處需要對(duì)你在init和viewDidLoad中創(chuàng)建的對(duì)象進(jìn)行釋放

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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