loadView和viewDidLoad

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

一、loadView

永 遠(yuǎn)不要主動(dòng)調(diào)用這個(gè)函數(shù)。view controller會(huì)在view的property被請求并且當(dāng)前view值為nil時(shí)調(diào)用這個(gè)函數(shù)。如果你手動(dòng)創(chuàng)建view笑撞,你應(yīng)該重載這個(gè)函數(shù)。如 果你用IB創(chuàng)建view并初始化view controller皮获,那就意味著你使用initWithNibName:bundle:方法麻诀,這時(shí)献酗,你不應(yīng)該重載loadView函數(shù)初家。
這個(gè)方法的默認(rèn)實(shí)現(xiàn)是這樣:先尋找有關(guān)可用的nib文件的信息偎窘,根據(jù)這個(gè)信息來加載nib文件,如果沒有有關(guān)nib文件的信息笤成,默認(rèn)實(shí)現(xiàn)會(huì)創(chuàng)建一個(gè)空白的UIView對象评架,然后讓這個(gè)對象成為controller的主view。
所以炕泳,重載這個(gè)函數(shù)時(shí),你也應(yīng)該這么做上祈。并把子類的view賦給view屬性(property)(你create的view必須是唯一的實(shí)例培遵,并且不被其他任何controller共享)浙芙,而且你重載的這個(gè)函數(shù)不應(yīng)該調(diào)用super。
如果你要進(jìn)行進(jìn)一步初始化你的views籽腕,你應(yīng)該在viewDidLoad函數(shù)中去做嗡呼。在iOS 3.0以及更高版本中,你應(yīng)該重載viewDidUnload函數(shù)來釋放任何對view的引用或者它里面的內(nèi)容(子view等等)皇耗。
這個(gè)網(wǎng)上的資料都說的很不全面南窗,尤其是藍(lán)色字部分。
二郎楼、viewDidLoad
這個(gè)函數(shù)在controller加載了相關(guān)的views后被調(diào)用万伤,而不論這些views存儲(chǔ)在nib文件里還是在loadView函數(shù)中生成。而多數(shù)情況下是做nib文件的后續(xù)工作呜袁。
網(wǎng)上資料對這個(gè)函數(shù)的描述則完全不對敌买。
三、viewDidUnload
這 個(gè)函數(shù)是viewDidLoad的對立函數(shù)阶界。在程序內(nèi)存欠缺時(shí)虹钮,這個(gè)函數(shù)被controller調(diào)用,來釋放它的view以及view相關(guān)的對象膘融。由于 controller通常保存這view以及相關(guān)object的引用芙粱,所以你必須使用這個(gè)函數(shù)來放棄這些對象的所有權(quán)以便內(nèi)存回收。但不要釋放那些難以重 建的數(shù)據(jù)氧映。
通常controller會(huì)保存nib文件建立的views的引用宅倒,但是也可能會(huì)保存著loadView函數(shù)創(chuàng)建的對象的引用。最完美的方法是使用合成器方法:
1
self.myCertainView = nil;
這樣合成器會(huì)release這個(gè)view屯耸,如果你沒有使用property拐迁,那么你得自己顯示釋放這個(gè)view。
網(wǎng)上對這個(gè)函數(shù)的描述含含糊糊疗绣,看了等于沒看线召。
四、結(jié)論
所以流程應(yīng)該是這樣:
(loadView/nib文件)來加載view到內(nèi)存 ——>viewDidLoad函數(shù)進(jìn)一步初始化這些view ——>內(nèi)存不足時(shí)多矮,調(diào)用viewDidUnload函數(shù)釋放views
—->當(dāng)需要使用view時(shí)有回到第一步
如此循環(huán)
需要厘清兩個(gè)概念,創(chuàng)建一個(gè)類和實(shí)例化一個(gè)類.在XCode中創(chuàng)建一個(gè)類和實(shí)例化一個(gè)類很容易區(qū)分,但是在IB(Interface Builder)中有時(shí)候就會(huì)迷糊.其實(shí)也很好區(qū)分,孤零零地創(chuàng)建了一個(gè)nib文件,沒有和其他可被實(shí)例化的類有直接或間接關(guān)系的時(shí)候,這個(gè)類或這些類 (一個(gè)nib文件俺也可能包含多個(gè)類)是沒有機(jī)會(huì)被實(shí)例化的,所以這種情況只是通過ib創(chuàng)建了一個(gè)類,而沒有實(shí)例化.真正的實(shí)例化還需要通過在Xcode 用代碼來讀取這個(gè)nib文件.知道這兩這的區(qū)別后這些方法也就容易辨認(rèn)多了

viewDidLoad其實(shí)沒什么可混淆的,無論通過什么途徑加載(Xcode或者IB,這里的加載屬于實(shí)例化)完view后肯定會(huì)執(zhí)行這個(gè)方法.

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

initWithNibName這個(gè)方法是在controller的類在IB中創(chuàng)建,但是通過Xcode實(shí)例化controller的時(shí)候用的.

awakeFromNib 這個(gè)方法是一個(gè)類在IB中被實(shí)例化是被調(diào)用的.看了帖子發(fā)現(xiàn)大家都推薦使用viewDidLoad而不要使用awakeFromNib,應(yīng)為 viewDidLoad會(huì)被多次調(diào)用,而awakeFromNib只會(huì)當(dāng)從nib文件中unarchive的時(shí)候才會(huì)被調(diào)用一次.實(shí)際測試中發(fā)現(xiàn),當(dāng)一個(gè) 類的awakeFromNib被調(diào)用的時(shí)候,那么這個(gè)類的viewDidLoad就不會(huì)被調(diào)用了,這個(gè)感覺很奇怪.

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

awakeFromNib
當(dāng).nib文件被加載的時(shí)候缓淹,會(huì)發(fā)送一個(gè)awakeFromNib的消息到.nib文件中的每個(gè)對象,每個(gè)對象都可以定義自己的awakeFromNib函數(shù)來響應(yīng)這個(gè)消息塔逃,執(zhí)行一些必要的操作讯壶。也就是說通過nib文件創(chuàng)建view對象是執(zhí)行awakeFromNib

viewDidLoad
當(dāng)view對象被加載到內(nèi)存是就會(huì)執(zhí)行viewDidLoad,所以不管通過nib文件還是代碼的方式創(chuàng)建對象都會(huì)執(zhí)行viewDidLoad

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末湾盗,一起剝皮案震驚了整個(gè)濱河市伏蚊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌格粪,老刑警劉巖躏吊,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氛改,死亡現(xiàn)場離奇詭異,居然都是意外死亡比伏,警方通過查閱死者的電腦和手機(jī)胜卤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赁项,“玉大人葛躏,你說我怎么就攤上這事∮撇耍” “怎么了舰攒?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長李剖。 經(jīng)常有香客問我芒率,道長,這世上最難降的妖魔是什么篙顺? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任偶芍,我火速辦了婚禮,結(jié)果婚禮上德玫,老公的妹妹穿的比我還像新娘匪蟀。我一直安慰自己,他們只是感情好宰僧,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布材彪。 她就那樣靜靜地躺著,像睡著了一般琴儿。 火紅的嫁衣襯著肌膚如雪段化。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天造成,我揣著相機(jī)與錄音显熏,去河邊找鬼。 笑死晒屎,一個(gè)胖子當(dāng)著我的面吹牛喘蟆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鼓鲁,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼蕴轨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了骇吭?” 一聲冷哼從身側(cè)響起橙弱,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后膘螟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體成福,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碾局,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年荆残,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片净当。...
    茶點(diǎn)故事閱讀 38,683評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡内斯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出像啼,到底是詐尸還是另有隱情俘闯,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布忽冻,位于F島的核電站真朗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏僧诚。R本人自食惡果不足惜遮婶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望湖笨。 院中可真熱鬧旗扑,春花似錦、人聲如沸慈省。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽边败。三九已至袱衷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笑窜,已是汗流浹背致燥。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怖侦,地道東北人篡悟。 一個(gè)月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像匾寝,于是被迫代替她去往敵國和親搬葬。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評論 2 349

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

  • 27艳悔、ViewController的didReceiveMemoryWarning是在什么時(shí)候調(diào)用的急凰?默認(rèn)的操作是...
    煙雨平生花飛舞閱讀 566評論 0 1
  • 每個(gè)ios開發(fā)者對loadView和viewDidLoad肯定都很熟悉,雖然這兩個(gè)函數(shù)使用上真的是非常簡單,但是和...
    純陽子_閱讀 751評論 0 1
  • 前言: 這部分內(nèi)容,對于大部分人來說使用起來可能已經(jīng)非常熟練,但是涉及到的細(xì)節(jié)還是挺多的抡锈,對于新開發(fā)者可能不是...
    饒鵬偉閱讀 960評論 1 5
  • 一疾忍、深復(fù)制和淺復(fù)制的區(qū)別? 1床三、淺復(fù)制:只是復(fù)制了指向?qū)ο蟮闹羔樢徽郑磧蓚€(gè)指針指向同一塊內(nèi)存單元!而不復(fù)制指向?qū)ο蟮?..
    iOS_Alex閱讀 1,362評論 1 27
  • 以下的方法作為每為ios開發(fā)工作者,肯定很熟悉,但有時(shí)又容易混淆,我對這些方法做了歸納總結(jié),有一部分是從網(wǎng)上找...
    如風(fēng)而行閱讀 447評論 0 3