UIViewController和UIView不同加載方式的生命周期函數(shù)

1 基本說明

話說做了iOS幾年凌盯,對于UIViewController和UIView的生命周期函數(shù)一直不是很重視奶陈,導(dǎo)致了很多模糊的地方抱完。今天專門寫一個(gè)Demo來驗(yàn)證一下,發(fā)現(xiàn)不同加載方式差別還是蠻大的蟆盹。具體Demo地址UIViewController和UIView生命周期加載和卸載孩灯。

2 加載UIViewController

每一種加載方式所調(diào)用的加載方法不同,而且還有一些細(xì)節(jié)地方不同逾滥。蘋果為我們提供了四種默認(rèn)的加載方式,不過我是純代碼黨峰档,AutoLayout以后败匹,我們通過Masonry這個(gè)第三方布局利器來布局,在我Git上也有專門總結(jié)的不同布局解決方案讥巡。接下來我們看看系統(tǒng)的四種方式掀亩,猶豫沒有什么理論性的東西,我就直接上代碼為主了:

  • 通過XIB加載欢顷。
  • 通過StoryBoard加載槽棍。
  • 通過NSCoding協(xié)議加載。
  • 通過代碼加載抬驴。

2.1 用XIB加載UIViewController

首先看初始化代碼:

- (IBAction)loadControllerFromXIB:(id)sender {
    XIBViewController *xibVC = [[XIBViewController alloc]initWithNibName:@"XIBViewController" bundle:[NSBundle mainBundle]];
    [self.navigationController pushViewController:xibVC animated:YES];
}

當(dāng)我們不實(shí)現(xiàn)loadView的時(shí)候打印結(jié)果:

2017-04-15 12:05:32.974 UIViewController和UIView生命周期加載和卸載[59883:1192231] initWithNibName
2017-04-15 12:05:32.987 UIViewController和UIView生命周期加載和卸載[59883:1192231] viewDidLoad
2017-04-15 12:05:32.987 UIViewController和UIView生命周期加載和卸載[59883:1192231] viewWillAppear
2017-04-15 12:05:32.996 UIViewController和UIView生命周期加載和卸載[59883:1192231] viewWillLayoutSubviews
2017-04-15 12:05:32.997 UIViewController和UIView生命周期加載和卸載[59883:1192231] viewDidLayoutSubviews
2017-04-15 12:05:33.002 UIViewController和UIView生命周期加載和卸載[59883:1192231] viewWillLayoutSubviews
2017-04-15 12:05:33.002 UIViewController和UIView生命周期加載和卸載[59883:1192231] viewDidLayoutSubviews
2017-04-15 12:05:33.506 UIViewController和UIView生命周期加載和卸載[59883:1192231] viewDidAppear
2017-04-15 12:05:37.142 UIViewController和UIView生命周期加載和卸載[59883:1192231] clickButton
//pop以后
2017-04-15 12:05:42.334 UIViewController和UIView生命周期加載和卸載[59883:1192231] viewWillDisappear
2017-04-15 12:05:42.837 UIViewController和UIView生命周期加載和卸載[59883:1192231] viewDidDisappear
2017-04-15 12:05:42.838 UIViewController和UIView生命周期加載和卸載[59883:1192231] dealloc

我發(fā)現(xiàn)一個(gè)很奇怪的現(xiàn)象炼七。如果用XIB加載的控制器,并且實(shí)現(xiàn)了一個(gè)空loadView,那么我們在XIB設(shè)置的視圖都失效了布持,應(yīng)該是系統(tǒng)返回了一個(gè)默認(rèn)的視圖覆蓋了豌拙。但是用Storyboard加載的視圖,實(shí)現(xiàn)一個(gè)空的loadView則不會丟失Storyboard里面的視圖题暖,這個(gè)是用XIB和Storyboard的一個(gè)注意點(diǎn)按傅。

-(void)loadView{
    [super loadView];
    NSLog(@"loadView");
}

2.2 用Storyboard加載UIViewController

初始化代碼:

- (IBAction)laodControllerFromSB:(id)sender {
    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Second" bundle:[NSBundle mainBundle]];
    SBViewController *sbVC = [sb instantiateViewControllerWithIdentifier:@"SBViewController"];
    [self.navigationController pushViewController:sbVC animated:YES];
}

運(yùn)行結(jié)果:

2017-04-15 12:26:45.364 UIViewController和UIView生命周期加載和卸載[59932:1194239] initWithCoder
2017-04-15 12:26:45.365 UIViewController和UIView生命周期加載和卸載[59932:1194239] awakeFromNib
2017-04-15 12:26:45.368 UIViewController和UIView生命周期加載和卸載[59932:1194239] loadView
2017-04-15 12:26:45.368 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewDidLoad
2017-04-15 12:26:45.368 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewWillAppear
2017-04-15 12:26:45.372 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewWillLayoutSubviews
2017-04-15 12:26:45.373 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewDidLayoutSubviews
2017-04-15 12:26:45.877 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewDidAppear
//pop以后
2017-04-15 12:26:50.669 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewWillDisappear
2017-04-15 12:26:51.172 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewDidDisappear
2017-04-15 12:26:51.172 UIViewController和UIView生命周期加載和卸載[59932:1194239] dealloc

對于Storyboard,使用一個(gè)空的loadView沒有影響胧卤。

2.3 用NSCodeing加載UIViewController

初始化代碼:

//這里我就不實(shí)現(xiàn)NSCoding協(xié)議了唯绍,直接傳入一個(gè)nil參數(shù)。
- (IBAction)loadControllerFromCoder:(id)sender {
    CoderViewController *coderVC = [[CoderViewController alloc]initWithCoder:nil];
    [self.navigationController pushViewController:coderVC animated:YES];
}

運(yùn)行結(jié)果:

2017-04-15 12:30:25.962 UIViewController和UIView生命周期加載和卸載[59932:1194239] initWithCoder
2017-04-15 12:30:25.963 UIViewController和UIView生命周期加載和卸載[59932:1194239] loadView
2017-04-15 12:30:25.963 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewDidLoad
2017-04-15 12:30:25.963 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewWillAppear
2017-04-15 12:30:25.967 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewWillLayoutSubviews
2017-04-15 12:30:25.967 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewDidLayoutSubviews
2017-04-15 12:30:25.968 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewWillLayoutSubviews
2017-04-15 12:30:25.968 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewDidLayoutSubviews
2017-04-15 12:30:26.470 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewDidAppear
//pop以后
2017-04-15 12:30:28.034 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewWillDisappear
2017-04-15 12:30:28.537 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewDidDisappear
2017-04-15 12:30:28.537 UIViewController和UIView生命周期加載和卸載[59932:1194239] dealloc

2.4 用代碼加載UIViewController

初始化代碼:

- (IBAction)loadControllerWithNone:(id)sender {
    CodeViewController *codeVC = [[CodeViewController alloc]init];
    [self.navigationController pushViewController:codeVC animated:YES];
}

運(yùn)行結(jié)果:

2017-04-15 12:31:48.785 UIViewController和UIView生命周期加載和卸載[59932:1194239] initWithNibName
2017-04-15 12:31:48.786 UIViewController和UIView生命周期加載和卸載[59932:1194239] init
2017-04-15 12:31:48.787 UIViewController和UIView生命周期加載和卸載[59932:1194239] loadView
2017-04-15 12:31:48.787 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewDidLoad
2017-04-15 12:31:48.788 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewWillAppear
2017-04-15 12:31:48.792 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewWillLayoutSubviews
2017-04-15 12:31:48.792 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewDidLayoutSubviews
2017-04-15 12:31:48.792 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewWillLayoutSubviews
2017-04-15 12:31:48.792 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewDidLayoutSubviews
2017-04-15 12:31:49.293 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewDidAppear
//pop以后
2017-04-15 12:31:55.594 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewWillDisappear
2017-04-15 12:31:56.098 UIViewController和UIView生命周期加載和卸載[59932:1194239] viewDidDisappear
2017-04-15 12:31:56.098 UIViewController和UIView生命周期加載和卸載[59932:1194239] dealloc

3 加載UIView

3.1 用XIB加載UIView

初始化代碼:

- (IBAction)loadViewFromXib:(id)sender {
    XibView *xibView = [[[NSBundle mainBundle]loadNibNamed:@"XIBView" owner:self options:nil] lastObject];
    [self.view addSubview:xibView];
}

運(yùn)行結(jié)果:

2017-04-15 12:33:22.194 UIViewController和UIView生命周期加載和卸載[59932:1194239] initWithCoder
2017-04-15 12:33:22.195 UIViewController和UIView生命周期加載和卸載[59932:1194239] awakeFromNib
2017-04-15 12:33:22.195 UIViewController和UIView生命周期加載和卸載[59932:1194239] willMoveToWindow
2017-04-15 12:33:22.195 UIViewController和UIView生命周期加載和卸載[59932:1194239] willMoveToSuperview
2017-04-15 12:33:22.196 UIViewController和UIView生命周期加載和卸載[59932:1194239] didMoveToWindow
2017-04-15 12:33:22.196 UIViewController和UIView生命周期加載和卸載[59932:1194239] didMoveToSuperview
2017-04-15 12:33:22.197 UIViewController和UIView生命周期加載和卸載[59932:1194239] layoutSubviews
//這里是點(diǎn)擊移除以后
2017-04-15 12:33:25.769 UIViewController和UIView生命周期加載和卸載[59932:1194239] willMoveToSuperview
2017-04-15 12:33:25.770 UIViewController和UIView生命周期加載和卸載[59932:1194239] willMoveToWindow
2017-04-15 12:33:25.771 UIViewController和UIView生命周期加載和卸載[59932:1194239] didMoveToWindow
2017-04-15 12:33:25.771 UIViewController和UIView生命周期加載和卸載[59932:1194239] didMoveToSuperview
2017-04-15 12:33:25.771 UIViewController和UIView生命周期加載和卸載[59932:1194239] dealloc

3.2 用代碼加載UIView

初始化代碼:

- (IBAction)loadViewWithNone:(id)sender {
    CodeView *codeView = [[CodeView alloc]init];
    codeView.backgroundColor = [UIColor greenColor];
    codeView.frame = CGRectMake(0, 500, 100, 50);
    [self.view addSubview:codeView];
}

運(yùn)行結(jié)果:

2017-04-15 12:38:57.562 UIViewController和UIView生命周期加載和卸載[60323:1208772] initWithFrame
2017-04-15 12:38:57.562 UIViewController和UIView生命周期加載和卸載[60323:1208772] init
2017-04-15 12:38:57.562 UIViewController和UIView生命周期加載和卸載[60323:1208772] willMoveToWindow
2017-04-15 12:38:57.563 UIViewController和UIView生命周期加載和卸載[60323:1208772] willMoveToSuperview
2017-04-15 12:38:57.563 UIViewController和UIView生命周期加載和卸載[60323:1208772] didMoveToWindow
2017-04-15 12:38:57.563 UIViewController和UIView生命周期加載和卸載[60323:1208772] didMoveToSuperview
2017-04-15 12:38:57.564 UIViewController和UIView生命周期加載和卸載[60323:1208772] layoutSubviews
//點(diǎn)擊移除以后
2017-04-15 12:39:02.751 UIViewController和UIView生命周期加載和卸載[60323:1208772] willMoveToSuperview
2017-04-15 12:39:02.752 UIViewController和UIView生命周期加載和卸載[60323:1208772] willMoveToWindow
2017-04-15 12:39:02.752 UIViewController和UIView生命周期加載和卸載[60323:1208772] didMoveToWindow
2017-04-15 12:39:02.752 UIViewController和UIView生命周期加載和卸載[60323:1208772] didMoveToSuperview
2017-04-15 12:39:02.752 UIViewController和UIView生命周期加載和卸載[60323:1208772] 點(diǎn)擊移除
2017-04-15 12:39:02.753 UIViewController和UIView生命周期加載和卸載[60323:1208772] dealloc

4 總結(jié)

UIViewController不同加載方式鉤子函數(shù)總結(jié):

  • XIB加載方式
    • initWithNibName
    • loadView(注意:如果實(shí)現(xiàn)一個(gè)空的方法灌侣,則XIB設(shè)置的屬性無效,會覆蓋XIB中的設(shè)置)
    • viewDidLoad
  • Storyboard加載方式
    • initWithCoder
    • awakeFromNib
    • loadView(實(shí)現(xiàn)是一個(gè)空方法或者不實(shí)現(xiàn)沒有影響)
    • viewDidLoad
  • NSCoding加載方式
    • initWithCoder
    • loadView
    • viewDidLoad
  • 代碼加載方式
    • initWithNibName
    • init(這個(gè)是我初始化的時(shí)候主動調(diào)用,如果用initWithNibName傳入nil參數(shù)則不會調(diào)用)
    • loadView
    • viewDidLoad

我們可以發(fā)現(xiàn)裂问,代碼加載方式和XIB加載方式一模一樣侧啼,如果有XIB則加載XIB,如果沒有XIB則可以代碼添加視圖堪簿。

UIView不同加載方式鉤子函數(shù)總結(jié):

  • XIB加載方式
    • initWithCoder
    • awakeFromNib
    • willMoveToWindow
  • 代碼加載方式
    • initWithFrame(設(shè)置frame痊乾。)
    • init(init方法調(diào)用)
    • willMoveToWindow

我們發(fā)現(xiàn),如果通過init初始化椭更,然后手動設(shè)置Frame哪审。則會導(dǎo)致上面的調(diào)用順序。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末虑瀑,一起剝皮案震驚了整個(gè)濱河市湿滓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舌狗,老刑警劉巖叽奥,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異痛侍,居然都是意外死亡朝氓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赵哲,“玉大人待德,你說我怎么就攤上這事》愣幔” “怎么了将宪?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長筷屡。 經(jīng)常有香客問我涧偷,道長,這世上最難降的妖魔是什么毙死? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任燎潮,我火速辦了婚禮,結(jié)果婚禮上扼倘,老公的妹妹穿的比我還像新娘确封。我一直安慰自己,他們只是感情好再菊,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布爪喘。 她就那樣靜靜地躺著,像睡著了一般纠拔。 火紅的嫁衣襯著肌膚如雪秉剑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天稠诲,我揣著相機(jī)與錄音侦鹏,去河邊找鬼。 笑死臀叙,一個(gè)胖子當(dāng)著我的面吹牛略水,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播劝萤,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼渊涝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了床嫌?” 一聲冷哼從身側(cè)響起跨释,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厌处,沒想到半個(gè)月后煤傍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘱蛋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年蚯姆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了五续。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡龄恋,死狀恐怖疙驾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情郭毕,我是刑警寧澤它碎,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站显押,受9級特大地震影響扳肛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乘碑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一挖息、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兽肤,春花似錦套腹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至笤休,卻和暖如春尖飞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背店雅。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工政基, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人底洗。 一個(gè)月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓腋么,卻偏偏與公主長得像咕娄,于是被迫代替她去往敵國和親亥揖。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評論 2 348

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