最近補(bǔ)了一下控制器和UI的加載原理
這篇文章先聊一下控制器的加載原理和一些注意的點(diǎn)宛官,有時(shí)候碰到問題疑苫,可以從這些點(diǎn)出發(fā)考慮航唆。
控制器兩種加載方式
xib和純代碼
xib的方式:
[[XHViewController alloc] initWithNibName:@"XHViewController" bundle:[NSBundle mainBundle]];
加載成功后搓扯,會(huì)調(diào)用awakeFromNib
純代碼的方式:
直接[[alloc] init];
兩種方式江场,走會(huì)走initWithNibName,只是純代碼的方式下捂敌,參數(shù)為nil
loadView方法
截了一張圖蟹演,看一下loadview方法的調(diào)用時(shí)機(jī)
我們看到阴颖,viewDidLoad之前調(diào)用的是loadView
系統(tǒng)在loadView方法里,加載控制器所對(duì)應(yīng)的view,如果重寫loadView而什么都不做云头,那么這個(gè)控制器就沒有view捐友。于是我又在viewdidload里打印了一下view
結(jié)果是什么呢?溃槐?匣砖。。昏滴。猴鲫。。
結(jié)果是crash了~~ ?來(lái)看一下堆棧信息
由此可見谣殊,無(wú)論load里是否成功創(chuàng)建了控制器的view拂共,viewdidload都會(huì)走。并且我在viewdidload里引用self.view 此時(shí)又會(huì)調(diào)用loadView蟹倾,loadView完了后又會(huì)走viewdidload匣缘,造成了死循環(huán)
結(jié)論:控制器的view是一個(gè)懶加載過程
生命周期
這里對(duì)生命周期這個(gè)問題的思考主要是兩種情況下,“appear”相關(guān)方法的調(diào)用時(shí)機(jī):控制器的push 和 pop操作時(shí)鲜棠。假設(shè)現(xiàn)在有兩個(gè)控制器Viewcontroller和XHViewController 當(dāng) ViewController ?Push 到 XHViewController時(shí)肌厨,方法的調(diào)用順序:
結(jié)論如上
接下來(lái)看一下從XHViewController ?Pop到ViewController
可以得出結(jié)論:當(dāng)前所在控制器先willDisappear --> 目標(biāo)控制器 willAppear -->當(dāng)前控制器 didDisappear --> 目標(biāo)控制器didAppear
布局安全方式
在控制器中,建議在viewWillLayoutSubviews而不是viewDidLoad中做布局
在視圖中豁陆,建議在layoutSubViews而不是initWithFrame中做布局
原因:layoutsubview是系統(tǒng)布局完成時(shí)調(diào)用的方法柑爸,在此方法中,所獲取的視圖frame是一定正確的盒音。而viewdidload和initWithFrame中的視圖大小表鳍,都可能不正確