(1)awakeFromNib和initWithCoder:差別 awakeFromNib 從xib或者storyboard加載完畢就會(huì)調(diào)用 initWithCoder: 只要對象是從文件解析來的,就會(huì)調(diào)用 同時(shí)存在會(huì)先調(diào)用initWithCoder:
(2)initWithCoder: & initWithFrame: initWithCoder:使用文件加載的對象調(diào)用(如從xib或stroyboard中創(chuàng)建) initWithFrame:使用代碼加載的對象調(diào)用(使用純代碼創(chuàng)建) 注意:所以為了同時(shí)兼顧從文件和從代碼解析的對象初始化,要同時(shí)在initWithCoder: 和 initWithFrame: 中進(jìn)行初始化
nib 加載結(jié)構(gòu)時(shí) 發(fā)送一個(gè)awakeFromNib消息告訴每個(gè)對象重建一個(gè)nib 歸檔,但只有在所有的檔案中的對象已加載和初始化。當(dāng)一個(gè)對象接收awakefromnibmessage,這是保證其所有出口和行動(dòng)連接已經(jīng)建立。
你必須調(diào)用awakefromnib super實(shí)施給父類的運(yùn)行的機(jī)會(huì)去做額外的初始化工作。雖然這種方法的默認(rèn)實(shí)現(xiàn)不執(zhí)行任何操作,許多UIKit類提供非空的實(shí)現(xiàn)。你可以叫super 實(shí)現(xiàn)在任何一點(diǎn)你自己的awakefromnib方法里。
實(shí)例化過程中,存檔中的每個(gè)對象未歸檔然后初始化的方法適合于它的類型。符合nscoding協(xié)議對象(包括所有子類和處理)正在用他們的initwithcoder初始化:方法。不符合nscoding協(xié)議所有的對象都是使用init方法初始化。在所有對象被實(shí)例化和初始化,the nib 加載代碼,將所有這些對象的出口和動(dòng)作的連接。然后調(diào)用對象的awakefromnib方法。更詳細(xì)的信息有關(guān)的步驟,然后nib在加載過程中,看到“NIB文件”在資源規(guī)劃指南。
// 先歸檔方法 -(id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { } return self; } // 保證出口和行動(dòng)連接已經(jīng)建立 調(diào)用 awakeFromNib -(void)awakeFromNib { [super awakeFromNib]; }
NIB文件是應(yīng)用程序所有對象的存檔。當(dāng)程序啟動(dòng)后,對象從文件中釋放,重新賦予生命,準(zhǔn)備接收用戶觸發(fā)的事件信息。這種機(jī)制有些與眾不同:大多數(shù)GUI的設(shè)計(jì)都是為界面布局產(chǎn)生源代碼;相反,Interface Builder則允許開發(fā)者編輯好頁面元素的狀態(tài)后,把它們保存在文件里面。在對象從文件中釋放、獲得生命,而沒有接收到用戶事件以前,所有的對象自動(dòng)發(fā)送awakeFromNib消息。開發(fā)者可以添加awakeFromNib方法,用來初始化文本框的值。
parm mark 2 -(void)awakeFromNib;從字面上理解,就是從nib文件中喚醒對象,完成對每一個(gè)對象的實(shí)例化或與nib文件的關(guān)聯(lián)。 誰喚醒這個(gè)方法?
awakeFromNib是由nib loading machinery發(fā)出的。[NSBundle loadNibFile:externalNameTable:withZone:],加載nib文件,完成初始化設(shè)置和連接,并且在所有關(guān)聯(lián)的對象上喚醒a(bǔ)wakeFromNib方法。
誰響應(yīng)這個(gè)方法?
Cunstom Controller 和Cunstom Window都會(huì)響應(yīng)awakeFromNib方法。當(dāng)一個(gè)nib文件已經(jīng)完成所有對象的加載之后,會(huì)對每一個(gè)與nib文件關(guān)聯(lián)的對象loop back。此時(shí),如果awakeFromNib方法中有需要響應(yīng)的對象,它就會(huì)在該對象上喚起awakeFromNib方法。因此,我們可以在awakeFromNib方法中操作任何甚至所有的nib中的對象。
需要注意的問題: 當(dāng)使用一個(gè)controller控制多個(gè)nib文件時(shí),awakeFromNib方法會(huì)被多次調(diào)用。因此,當(dāng)不使用awakeFromNib方法來完成nib對象的初始化時(shí),需要注意此方法的多次調(diào)用對其他nib文件造成的影響。