awakeFromNib 和 initWithNibName, initWithCoder

每個ios開發(fā)者對loadView和viewDidLoad肯定都很熟悉,雖然這兩個函數(shù)使用上真的是非常簡單,但是和類似的initWithNibName/awakeFromNib/initWithCoder放在一起還是非常容易讓人混淆的.

大前提是UIViewController有一個UIView.同時,需要理清兩個概念,

一、實例化一個類.

二、創(chuàng)建一個類。

在XCode中創(chuàng)建一個類和實例化一個類很容

易區(qū)分,但是在IB(Interface

Builder)中有時候就會迷糊.其實也很好區(qū)分,孤零零地創(chuàng)建了一個nib文件,沒有和其他可被實例化的類有直接或間接關(guān)系的時候,這個類或這些類

(一個nib文件俺也可能包含多個類)是沒有機(jī)會被實例化的,所以這種情況只是通過ib創(chuàng)建了一個類,而沒有實例化.真正的實例化還需要通過在Xcode

用代碼來讀取這個nib文件.知道這兩這的區(qū)別后這些方法也就容易辨認(rèn)多了。(鬼話看不懂)

viewDidLoad其實沒什么可混淆的,無論通過什么途徑加載(Xcode或者IB,這里的加載屬于實例化)完view后肯定會執(zhí)行這個方法.(加載ib之后調(diào)用)

loadView需要分兩種情況.當(dāng)你通過Xcode實例化一個類的時候就需要自己在controller中實現(xiàn)這個方法.而在IB中實例化就不需要實現(xiàn)它.

initWithNibName這個方法是在controller的類中,在IB中創(chuàng)建nib文件,但是通過Xcode實例化controller的時候用的.(一構(gòu)造函數(shù))

awakeFromNib這個方法是一個類在IB中被實例化是被調(diào)用的.看了帖子發(fā)現(xiàn)大家都推薦使用viewDidLoad而不要使用

awakeFromNib,應(yīng)為viewDidLoad會被多次調(diào)用,而awakeFromNib只會當(dāng)從nib文件中unarchive的時候才會被調(diào)

用一次.實際測試中發(fā)現(xiàn),當(dāng)一個類的awakeFromNib被調(diào)用的時候,那么這個類的viewDidLoad就不會被調(diào)用了,這個感覺很奇怪.

initWithCoder是一個類在IB中創(chuàng)建但在xocdde中被實例化時被調(diào)用的.比如,通過IB創(chuàng)建一個controller的nib文件,然后在xocde中通過initWithNibName來實例化這個controller,那么這個controller的initWithCoder會被調(diào)用.

如果你的對象是UIViewControler的子類,那么你必須調(diào)用- (id)initWithNibName:(NSString

*)nibNameOrNil

bundle:(NSBundle*)nibBundleOrNil;方法去調(diào)用NIB文件初始化自身,即使那沒有使用nib文件也會調(diào)用這個函數(shù)(默認(rèn)

情況下init方法已經(jīng)為你的做這件事情了),如果你調(diào)用這個方法,并傳遞的兩個參數(shù)為空(nil),然后類會調(diào)用-loadView去讀取一個名字和你

的UIViewController名字相同的nib文件,來初始化自身。如果沒有這樣的nib文件,你必須調(diào)用-setView:來設(shè)置一個

self.view。或者重載-loadView

方法。

init/loadView/viewDidLoad/viewDidUnload

這么細(xì)節(jié)的東西想來大家都不在意,平時也不會去關(guān)系,但是在面試時卻常常被提到,所以了解viewController的生命周期還是很有必要的。由init、loadView、viewDidLoad、viewDidUnload、dealloc的關(guān)系說起

init方法

在init方法中實例化必要的對象(遵從LazyLoad思想)

?init方法中初始化ViewController本身

loadView方法

當(dāng)view需要被展示而它卻是nil時,viewController會調(diào)用該方法。不要直接調(diào)用該方法。

如果手工維護(hù)views,必須重載重寫該方法

如果使用IB維護(hù)views,必須不能重載重寫該方法

loadView和IB構(gòu)建view

你在控制器中實現(xiàn)了loadView方法,那么你可能會在應(yīng)用運(yùn)行的某個時候被內(nèi)存管理控制調(diào)用。 如果設(shè)備內(nèi)存不足的時候, view控制器會收到didReceiveMemoryWarning的消息。 默認(rèn)的實現(xiàn)是檢查當(dāng)前控制器的view是否在使用。如果它的view不在當(dāng)前正在使用的viewhierarchy里面,且你的控制器實現(xiàn)了loadView方法,那么這個view將被release,loadView方法將被再次調(diào)用來創(chuàng)建一個新的view。

viewDidLoad方法

viewDidLoad 此方法只有當(dāng)view從nib文件初始化的時候才被調(diào)用。

重載重寫該方法以進(jìn)一步定制view

在iPhone OS 3.0及之后的版本中,還應(yīng)該重載重寫viewDidUnload來釋放對view的任何索引

viewDidLoad后調(diào)用數(shù)據(jù)Model

?

viewDidUnload方法?

當(dāng)系統(tǒng)內(nèi)存吃緊的時候會調(diào)用該方法(注:viewController沒有被dealloc)

內(nèi)存吃緊時,在iPhone OS 3.0之前didReceiveMemoryWarning是釋放無用內(nèi)存的唯一方式,但是OS3.0及以后viewDidUnload方法是更好的方式

在該方法中將所有IBOutlet(無論是property還是實例變量)置為nil(系統(tǒng)releaseview時已經(jīng)將其release掉了)

在該方法中釋放其他與view有關(guān)的對象、其他在運(yùn)行時創(chuàng)建(但非系統(tǒng)必須)的對象、在viewDidLoad中被創(chuàng)建的對象、緩存數(shù)據(jù)等release對象后,將對象置為nil(IBOutlet只需要將其置為nil,系統(tǒng)releaseview時已經(jīng)將其release掉了)

一般認(rèn)為viewDidUnload是viewDidLoad的鏡像,因為當(dāng)view被重新請求時,viewDidLoad還會重新被執(zhí)行

viewDidUnload中被release的對象必須是很容易被重新創(chuàng)建的對象(比如在viewDidLoad或其他方法中創(chuàng)建的對象),不要release用戶數(shù)據(jù)或其他很難被重新創(chuàng)建的對象

dealloc方法

viewDidUnload和dealloc方法沒有關(guān)聯(lián),dealloc還是繼續(xù)做它該做的事情

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,380評論 2 379

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

  • 27、ViewController的didReceiveMemoryWarning是在什么時候調(diào)用的?默認(rèn)的操作是...
    煙雨平生花飛舞閱讀 603評論 0 1
  • 7、不使用IB是,下面這樣做有什么問題? 6、請說說Layer和View的關(guān)系,以及你是如何使用它們的。 1.首先...
    AlanGe閱讀 702評論 0 1
  • 37.cocoa內(nèi)存管理規(guī)則 1)當(dāng)你使用new,alloc或copy方法創(chuàng)建一個對象時,該對象的保留計數(shù)器值為1...
    如風(fēng)家的秘密閱讀 880評論 0 4
  • 問題:從一個控制器push到另一個控制器時,有時會出現(xiàn)卡頓的一種現(xiàn)象,如下 測試代碼里什么數(shù)據(jù)都沒有加載,所以排除...
    茗涙閱讀 3,633評論 0 4
  • 一、深復(fù)制和淺復(fù)制的區(qū)別? 1、淺復(fù)制:只是復(fù)制了指向?qū)ο蟮闹羔槪磧蓚€指針指向同一塊內(nèi)存單元!而不復(fù)制指向?qū)ο蟮?..
    iOS_Alex閱讀 1,406評論 1 27