接觸ios開(kāi)發(fā)已經(jīng)兩周了票摇,按照公司給我安排新手學(xué)習(xí)任務(wù)一步一步接觸摄杂。對(duì)于objective-c和iphone開(kāi)發(fā)有了初步的認(rèn)識(shí)和了解左腔。
今天小領(lǐng)導(dǎo)在檢查我提交的demo時(shí)提出了一個(gè)建議,建議我在viewController里面的dealloc函數(shù)中對(duì)屬性和成員變量進(jìn)行release懂拾。我很納悶煤禽,為什么我已經(jīng)在viewDidUnLoad中對(duì)這些成員和屬性進(jìn)行釋放并置空了,此處還要進(jìn)行release岖赋。這樣不會(huì)導(dǎo)致成員變量的引用計(jì)數(shù)值為負(fù)數(shù)嗎檬果?小領(lǐng)導(dǎo)說(shuō)這涉及到viewController的生命周期,因?yàn)橛锌赡躹iewController根本就不會(huì)進(jìn)入viewDidLoad中唐断,那么也就不會(huì)調(diào)用viewDidUnLoad汁汗。如果日后有代碼復(fù)用時(shí)可能就會(huì)出現(xiàn)問(wèn)題。一知半解的感覺(jué)栗涂,于是查看apple的API,好好認(rèn)識(shí)了一下時(shí)時(shí)刻刻都在打交道的viewController知牌。
首先我們來(lái)了解一下什么是viewController。viewController叫做視圖控制器斤程。對(duì)內(nèi)是用于管理視圖角寸,對(duì)外則是與其他的viewcontroller進(jìn)行通信。它繼承于NSObject忿墅。它分為兩種類型扁藕,一種叫contentViewController,內(nèi)容視圖控制器疚脐,主要用于體現(xiàn)內(nèi)容亿柑,如UITableView UIViewController這種直接顯示內(nèi)容的;還有一種叫做containerViewController棍弄,容器視圖類望薄。典型的就是tabBar,和navigation.它還包含好幾個(gè)其它的viewController.
每個(gè)view都有一個(gè)viewController疟游。且view的生命周期也在viewController里面。所以在view釋放之前痕支,viewcontroller是不可以釋放的颁虐。那viewController的生命周期到底是怎么樣的呢?和我一步一步來(lái)看吧卧须。
step1:initWithNib viewController 會(huì)進(jìn)行alloc,并init.
step2: loadView 在這里會(huì)看它的子類是否有重寫(xiě)這個(gè)函數(shù)另绩,如果重寫(xiě)了則調(diào)用子類的,否則就調(diào)用她自己的花嘶。注意笋籽,這個(gè)時(shí) 候視圖還是沒(méi)有沒(méi)加載進(jìn)來(lái)的哦。
step3:viewDidLoad 這個(gè)時(shí)候視圖已經(jīng)存在了椭员「汕可以在這里添加你想要添加的UI控件了。
step4:viewWillAppear 視圖將出現(xiàn)在屏幕上了
step5:viewDidAppear 視圖已經(jīng)成功在屏幕上渲染完成了
step6:viewWillDisappear 視圖將要消失了
step7:viewDidDisappear 視圖從屏幕上消失了
step8:viewDidUnLoad 當(dāng)發(fā)生內(nèi)存警告的時(shí)候拆撼,如果本視圖不是當(dāng)前正在顯示的視圖容劳,則會(huì)執(zhí)行這個(gè)函數(shù)。將子視圖釋放闸度。
目前iOS6.0之后竭贩,你不需要做任何以前viewDidUnload的事情,更不需要把以前viewDidUnload的代碼移動(dòng)到 didReceiveMemoryWarning方法中莺禁。
因?yàn)橄到y(tǒng)為你做了這件事留量。具體:
http://www.cocoachina.com/ios/20130520/6236.html
step9:dealloc 釋放viewController
而view的生命周期則是step3_step8.
總結(jié):
loadView和viewDidLoad的區(qū)別就是,loadView時(shí)view還沒(méi)有生成哟冬,viewDidLoad時(shí)楼熄,view已經(jīng)生成了,loadView只會(huì)被調(diào)用一次浩峡,而viewDidLoad可能會(huì)被調(diào)用多次(View可能會(huì)被多次加載)可岂,當(dāng)view被添加到其他view中之前,會(huì)調(diào)用viewWillAppear翰灾,之后會(huì)調(diào)用viewDidAppear缕粹。當(dāng)view從其他view中移除之前,調(diào)用viewWillDisAppear纸淮,移除之后會(huì)調(diào)用viewDidDisappear平斩。當(dāng)view不再使用時(shí),受到內(nèi)存警告時(shí)咽块,ViewController會(huì)將view釋放并將其指向?yàn)閚il绘面。
ViewController的生命周期中各方法執(zhí)行流程如下:
init—>loadView—>viewDidLoad—>viewWillApper—>viewDidApper—>viewWillDisapper—>viewDidDisapper—>viewWillUnload->viewDidUnload—>dealloc
viewController在IOS開(kāi)發(fā)中很重要,因?yàn)槿魏我晥D的操作都會(huì)涉及到它。我的理解暫時(shí)也還挺淺揭璃,希望在日后的學(xué)習(xí)中晚凿,不斷加深對(duì)他的認(rèn)識(shí)。也會(huì)不斷在博客上分享自己的收獲塘辅。