高級(jí)內(nèi)存主題
創(chuàng)新互聯(lián)主營(yíng)長(zhǎng)沙縣網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,app開(kāi)發(fā)定制,長(zhǎng)沙縣h5微信小程序搭建,長(zhǎng)沙縣網(wǎng)站營(yíng)銷(xiāo)推廣歡迎長(zhǎng)沙縣等地區(qū)企業(yè)咨詢(xún)現(xiàn)在你已經(jīng)學(xué)會(huì)了基本的內(nèi)存管理技術(shù),我講介紹一些高級(jí)內(nèi)存主題。
Retain/Relationship生命周期
在舊的內(nèi)存管理世界中,如果對(duì)象A擁有對(duì)象B,當(dāng)對(duì)象Adeallocated時(shí),對(duì)象A必須release對(duì)象B。但是,如果對(duì)象A擁有對(duì)象B,對(duì)象B又擁有對(duì)象A,會(huì)發(fā)生什么呢?
你可以通過(guò)調(diào)用release方法,然后把引用設(shè)置為nil來(lái)release對(duì)象A。但是,因?yàn)閷?duì)象B仍然擁有對(duì)象A,對(duì)象A的引用計(jì)數(shù)大于0。當(dāng)你release對(duì)象B的時(shí)候同樣如此;它的引用計(jì)數(shù)仍然大于0,因?yàn)閷?duì)象A仍然擁有對(duì)象B。
類(lèi)似這樣的引用,任何對(duì)象都不會(huì)被deallocated,如圖7-4展示的那樣。
對(duì)于新的ARC機(jī)制,這種引用依然存在,如果你有兩個(gè)對(duì)象互相之間有強(qiáng)引用,兩個(gè)對(duì)象都會(huì)泄露。
因此,如果你想兩對(duì)象彼此應(yīng)用,你需要怎么做呢?你需要使用弱引用。
弱引用
因此,為了避免循環(huán)引用,只有對(duì)象A持有對(duì)象B的強(qiáng)引用,對(duì)象B只持有對(duì)象A的弱引用。
UIViewController
所有的iPhone應(yīng)用都要用到UIViewController(要不然你在哪里顯示UI?)。因此,理解UIViewController的生命周期能夠幫助你很多重要的事情,例如:
更好的利用內(nèi)存
避免內(nèi)存泄露
提高響應(yīng)
在教學(xué)和培訓(xùn)的時(shí)候,我發(fā)現(xiàn)很多開(kāi)發(fā)者對(duì)view controller存在嚴(yán)重的誤解,他們并沒(méi)有理解view controller的生命周期。在iPhone環(huán)境中,有一些主要的管理過(guò)程來(lái)控制view controller對(duì)象的生命周期,例如:
加載view
當(dāng)系統(tǒng)需要回收內(nèi)存時(shí)卸載view
release view
從UI中顯示或隱藏view
加載view的過(guò)程
當(dāng)一個(gè)view controller請(qǐng)求它的view的時(shí)候,它會(huì)檢查view是否已經(jīng)加載到內(nèi)存中。如果沒(méi)有,會(huì)加載它然后viewDidLoad方法會(huì)被調(diào)用。圖7-6顯示了加載view的過(guò)程。
在加載view的過(guò)程中,你需要記住一些性能方面的問(wèn)題:
如果你重寫(xiě)了loadView方法,你需要?jiǎng)?chuàng)建view的層次結(jié)構(gòu)來(lái)顯示UI。這會(huì)導(dǎo)致輕量級(jí)的性能提升,因?yàn)椴恍枰獜膎ib文件加載。
如果你沒(méi)有重寫(xiě)loadView方法,iOS環(huán)境會(huì)自動(dòng)的查找你指定的nib文件或和view controller同名的nib文件。使用nib文件比較好維護(hù)同時(shí)它有拖拉的功能。
如果沒(méi)有匹配到任何東西,iOS環(huán)境會(huì)創(chuàng)建一個(gè)新的空的view,然后返回這個(gè)空的view。
卸載view的過(guò)程
對(duì)于內(nèi)存和性能來(lái)說(shuō),這個(gè)過(guò)程是非常重要的。主要原因是當(dāng)你的應(yīng)用有內(nèi)存警告和需要回收內(nèi)存時(shí),這個(gè)過(guò)程依然在運(yùn)行。在這個(gè)過(guò)程中,didReceiveMemoryWarning方法首先被調(diào)用,然后viewDidUnload方法被調(diào)用。在屏幕上顯示的views不會(huì)被卸載。在圖7-7中你可以看到這個(gè)過(guò)程。
在卸載view的過(guò)程中,有很多內(nèi)存和性能方面的問(wèn)題你需要記?。?/p>
確保當(dāng)方法didReceiveWarning被調(diào)用時(shí),你要清除一些重量級(jí)對(duì)象的內(nèi)存緩存,比如圖片緩存。如果你不這樣做的話,iOS系統(tǒng)會(huì)強(qiáng)制關(guān)閉你的應(yīng)用,這是一個(gè)非常糟糕的用戶體驗(yàn)。
這時(shí)你不應(yīng)該清除或release任何view,因?yàn)檫@是不安全的。相反,你應(yīng)該調(diào)用[super didReceiveWarning],這樣父類(lèi)能夠檢查release這個(gè)subview是否安全。
如果release它的view是安全的,方法viewDidUnload會(huì)被調(diào)用。你可以選擇重寫(xiě)這個(gè)方法來(lái)一些你需要的清理工作。
注意:當(dāng)你重寫(xiě)加載view的方法時(shí),如init,loadView和viewDidload,必須先調(diào)用父類(lèi)的方法。但是,如果你重寫(xiě)清除方法,如didReceiveWarning,viewDidUnload或dealloc,調(diào)用父類(lèi)的方法必須在方法的尾部。 |
在viewDidUnload方法中有一些開(kāi)發(fā)者感到很迷惑的東西。
viewDidLoad和LviewDidUnload不是相互對(duì)應(yīng)的。viewDidLoad是在view controller初始化和請(qǐng)求view之后調(diào)用的。viewDidUnload是在收到內(nèi)存警告時(shí)調(diào)用的。在調(diào)用viewDidUnload方法之后,不會(huì)調(diào)用view controller對(duì)象的dealloc方法。卸載的view將會(huì)被deallocated。
在viewDidUnload中,你只能清除你的views;其他對(duì)象將在didReceiveWarning方法中被清除或release。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
當(dāng)前文章:iOS優(yōu)化內(nèi)存,提升性能之三-創(chuàng)新互聯(lián)
網(wǎng)站地址:http://aaarwkj.com/article24/phgje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開(kāi)發(fā)、網(wǎng)站改版、云服務(wù)器、電子商務(wù)、網(wǎng)站排名、網(wǎng)頁(yè)設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容