上一章內(nèi)容講解了xib文件編譯后成nib臭蚁,而反過(guò)來(lái)nib文件如何加載完成頁(yè)面的渲染的呢舅锄?我們來(lái)梳理一下整個(gè)過(guò)程。
nib的加載過(guò)程分析
1.將nib文件加載入內(nèi)存
一種法法:通過(guò)bundle加載
[[NSBundle mainBundle] loadNibNamed:@"TestView" owner:self options:nil][0];
還有一種方法张肾,通過(guò)nib加載
[UINib nibWithNibName:@"TestView" bundle:[NSBundle mainBundle]];
2.“解固化”并實(shí)例化出nib文件里對(duì)應(yīng)的對(duì)象
即將nib對(duì)象進(jìn)一步解壓,生成對(duì)應(yīng)的模型對(duì)象盆昙。這個(gè)過(guò)程會(huì)調(diào)用initWithCoder方法桶良,將nib數(shù)據(jù)序列化,生產(chǎn)對(duì)應(yīng)的模型對(duì)象稽犁,這個(gè)方法中就可以給這個(gè)對(duì)象添加子對(duì)象了焰望。
3.建立connections(outlets、actions)
outlets與actions就是我們之前提到的建立的IBOutlet與IBAction的“連接”已亥。建立connections的順序是先建立outliets連接熊赖,然后建立actions連接。sourcecode中就會(huì)將兩者放在<connections>標(biāo)簽中虑椎,nib加載到步驟3的時(shí)候就會(huì)根據(jù)這個(gè)標(biāo)簽去建立對(duì)應(yīng)的關(guān)系震鹉。
4.調(diào)用awakeFromNib方法:
- (void)awakeFromNib {
[super awakeFromNib];
}
注意該函數(shù)只會(huì)在綁定xib的類(lèi)中調(diào)用,不會(huì)在它的File's Owner及其內(nèi)部的Object類(lèi)中調(diào)用
5.將xib中可見(jiàn)的控件顯示出來(lái)捆姜。
獲得了所有的對(duì)象并加載所有代碼邏輯后传趾,通過(guò)calayer渲染到屏幕上。
了解整個(gè)過(guò)程后娇未,我們也理解了為什么使用xib比代碼效率相對(duì)慢一些墨缘。另外還一個(gè)需要注意的加載過(guò)程的問(wèn)題,當(dāng)我們使用xib加載tableview的cell的時(shí)候,一定要注意不要使用第一步中第一種NSBundle的loadNibNamed的加載镊讼,要使用第二種UINib的nibWithNibName方法加載cell宽涌。
tableview的一屏?xí)@示多個(gè)cell,這個(gè)時(shí)候就涉及一個(gè)復(fù)用的問(wèn)題蝶棋,NSBundle對(duì)象無(wú)法與xib文件產(chǎn)生映射關(guān)系卸亮,所以每次加載cell都是讀文件,而UINib對(duì)象與xib文件是映射關(guān)系玩裙,它就是內(nèi)存中的xib文件兼贸,圖中的兩條紅色箭頭是理解的關(guān)鍵,所以我們可以通過(guò)UINib對(duì)象來(lái)達(dá)到緩存的目的吃溅,這樣在tableview滾動(dòng)式時(shí)溶诞,就會(huì)動(dòng)態(tài)的取緩存的cell,不用頻繁加載文件决侈。