版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Objective-C內(nèi)存管理技巧與經(jīng)驗(yàn)在具僉了基礎(chǔ)的理論知識(shí)后,還希耍些內(nèi)存管理I:的技巧與經(jīng)驗(yàn)。這點(diǎn)山英對(duì)從JAVA類語誌過來的程序員,咱幻實(shí)話實(shí)說,內(nèi)存管理真不是咋們長頊,更需娶花更多的時(shí)何與梢力來積累相關(guān)知識(shí)。不過話又說何來,人都說做生總的都講究吃虧6Jim錢在后.開始時(shí)幀女賣點(diǎn)力,這座英麗的金山-早晚是我們的。A_A1, 把對(duì)您視為內(nèi)存.毎個(gè)対彖實(shí)例的狀態(tài)都被保存在不同的內(nèi)存區(qū)域中。因此對(duì)彖的創(chuàng)建與刪除動(dòng)作等價(jià)它所占用內(nèi)存的分配與回收.基T-Foundation的類庫,都通過個(gè)根對(duì)象NSObject或有同樣接口的其它類,為實(shí)例提供關(guān)聯(lián)記數(shù)的機(jī)制(包括延遲釋放的對(duì)彖)大多在Apple類
2、庫的類與準(zhǔn)尸NSObject”的子類或它接口的實(shí)現(xiàn)類,都可以享河內(nèi)存記數(shù)策略帶來的管理能力。Apple類庫(Applesframeworks)出臺(tái)后,內(nèi)存管理機(jī)制就被放在對(duì)象創(chuàng)建與銷毀的生命周期中(雖然何些地方還是些C的方法與結(jié)構(gòu)).你會(huì)發(fā)現(xiàn)這其實(shí)是件很右盤思的爭(zhēng)恰,它不像C一樣有方法直接操作內(nèi):(malloc/free),也不像帯GC的語二(Java&Smalltalk&Ruby&Python.-)1動(dòng)但理內(nèi)存.它是一種基丁咲聯(lián)記數(shù)與延時(shí)禪放(Autorelease機(jī)制,下面會(huì)講到)的機(jī)制悴理內(nèi)存,我們可以認(rèn)為它是基以上兩種內(nèi)存管理方案中何.一個(gè)比較中廂的內(nèi)存符理解決方案。2, 對(duì)象持有制(
3、ObjectOwnership.不知道要翻譯成啥.暫時(shí)叫他持有制,其實(shí)這個(gè)叫法本身就有些字面匕的誤導(dǎo).了解它的本質(zhì)就0K了,不必太在意它叫什么.a_a)基礎(chǔ)類庫與其它類庫都推薦我們下面兩個(gè)對(duì)象創(chuàng)建與銷毀的策略:a如果你創(chuàng)建了一個(gè)對(duì)彖.你令貴任把它銷毀b如果你想持冇個(gè)并不是你創(chuàng)建的對(duì)象,你帝要retain它,并在不需要時(shí)release抻首先,對(duì)象的創(chuàng)建者就足它的擁右者.只冇它的擁令者才町以銷毀它。貫徹這條策略會(huì)使你的代碼變的更簡(jiǎn)單,更強(qiáng)壯,并丄町以繞開很女的引川己經(jīng)銷毀對(duì)彖或內(nèi)存泄籃(沒有川的對(duì)彖卻始終保持關(guān)系)造成的BUG。使用”NSAutoreleasePool”可以實(shí)現(xiàn)延遲釋放機(jī)制.創(chuàng)建咅
4、可以把銷毀的責(zé)任交給NSAutoreleasePool的對(duì)彖實(shí)例(在下面會(huì)有詳細(xì)脈理說明)3, 對(duì)您的內(nèi)存分配與初始化SomeClass*anlnstance=SomeClassallocinit;這是一個(gè)傳統(tǒng)的創(chuàng)建對(duì)彖的方法,首先分配一段內(nèi)存,然后初始化.另外.在操作系統(tǒng)層而上還冇內(nèi)存區(qū)的概念,為J提高內(nèi)存區(qū)域的定位使用能力,町以用allocWithZone:方法來嘗試分配一段指定的區(qū)域?!盢SObjecf1的仃?duì)顟B(tài)的了類都必需耍擴(kuò)展初始化方法,例如:interfaceCartesianCoordinate:NSObjectNSNumber*abscissa;NSNumber*ordinat
5、e;-(CartesianCoordinate*)imtWithAbscissa:(NSNumber*)anAbscissaordinate:(NSNumber*)anOrdinate;enduNSObjectn還捉供Tcopy.mutableCopyKopyWithZone.mutableCopyWithZone”方法可以分配內(nèi)存.復(fù)屈性來達(dá)到復(fù)制對(duì)彖實(shí)例的11的。4. 對(duì)象的回收如果你不想再使用一個(gè)對(duì)彖時(shí),就發(fā)送”release的消息.半所有人都不在使用它,肖沒有任何一個(gè)關(guān)聯(lián)時(shí),它就會(huì)被1*1動(dòng)發(fā)送dealloc”方法回收。持仃屈性的類,應(yīng)該它在的dealloc”方法內(nèi)釋放所有它持仃的対線
6、實(shí)例.implementationCartesianCoordinate-(void)deallocabscissarelease;(ordinaterelease;returnsuperdealloc;end5, 對(duì)象實(shí)例的關(guān)聯(lián)記數(shù)其實(shí)你應(yīng)該可以了解到,關(guān)聯(lián)記數(shù)是一個(gè)非常非常簡(jiǎn)單的邪怡。毎個(gè)對(duì)彖都持仃一關(guān)聯(lián)記數(shù)器retaincount,它僅僅負(fù)資記錄關(guān)聯(lián)它的總個(gè)數(shù)。當(dāng)一個(gè)對(duì)彖以”init,initWith”或其它復(fù)制方法創(chuàng)建時(shí),這個(gè)數(shù)就被系統(tǒng)隱式的記為”】”所冇英它的對(duì)彖可以發(fā)送retain消息持冇它,這個(gè)方法也僅僅是在這個(gè)記數(shù)上加”1而己.相對(duì)應(yīng)的,毎一個(gè)-realease方法也只是把這個(gè)
7、數(shù)減T當(dāng)它為”0時(shí),這個(gè)對(duì)象被回收(調(diào)用它的dealloc方法.你也可以調(diào)用retainCount方法來査詢這個(gè)數(shù)字.-(void)notifyUserOfError:(NSString*)errorStringNSMutableString*alertStringnil;alertString=(NSMutableStringallocimtWithString:Thefollowingerroroccurred:H;alertStringappendString:errorstring;NSRunAlertPaneKalertString.);(alertStringrelease;ret
8、urn;6臨時(shí)對(duì)象與自動(dòng)釋放方法就像你上而看到的.經(jīng)常需娶創(chuàng)建-個(gè)只用次的對(duì)彖.然后銷毀它。在上而的例了里,半作用域定義好后它是很簡(jiǎn)單的一件.但存在一個(gè)問題.不能返何一個(gè)臨時(shí)的對(duì)彖給調(diào)用者川在C語言中冇一個(gè)常用的方法,就是使用己經(jīng)存在的靜態(tài)緩存或是返I叫動(dòng)態(tài)分配的內(nèi)存,町能你己經(jīng)想到了,它的調(diào)用者負(fù)貴釋放它.這個(gè)方案珮咱們上面提到的內(nèi)心俗理策略相左,在Foundation架構(gòu)中C經(jīng)提供了一個(gè)更優(yōu)雅的解決方案.通過延遲秤放機(jī)制讓創(chuàng)建臨時(shí)的對(duì)發(fā)可以最終“動(dòng)鄂放看以下代碼:-(void)notifyllserOfError:(NSString*)errorStringNSMutableString*
9、alertString=nil;alertStringNSMutableStringstringWithString:”Thefollowingerroroccurred:u;alertStringappendString:errorString;NSRunAlertPaneKalertString.);return;你可以看到alertstring”對(duì)線在創(chuàng)建后并沒有調(diào)用release,而這個(gè)方法的調(diào)用者也不用擔(dān)心要不要去釋放它,肉為在這里創(chuàng)建的對(duì)彖是一個(gè)autoreleased”対彖,血這種對(duì)彖會(huì)被門動(dòng)釋放。一個(gè)門動(dòng)釋放対彖會(huì)在將來的某一時(shí)間被“動(dòng)調(diào)用release”方法I動(dòng)釋放對(duì)彖被創(chuàng)建
10、后,若沒冇被顯示的retain,在冇限的生命周期中被會(huì)fl動(dòng)銷毀。如果你想指定一個(gè)對(duì)彖為H動(dòng)釋放的話,可以調(diào)用”autorelease”方法。alertStringNSMutableStringstringWithString:Thefollowingerroroccurred:;完全和以下足-樣的:alertString=NSMutableStringallocinitWithString:Thefollowingerroroccurred:,(autorelease;仃這么個(gè)貫例,就足像stringWithString:類似的方法都會(huì)創(chuàng)建個(gè)門動(dòng)郭放的實(shí)例,在類庫里莎處町見。7,自動(dòng)釋放進(jìn)階
11、,讓我們更秦一步了解它的工作原理雖然fl動(dòng)釋放對(duì)彖的概念是如此簡(jiǎn)的但了解它更多的丁作氐理還是很冇必耍的.不然在我們的嵌入咒設(shè)條的開發(fā)中,仍然會(huì)走入內(nèi)存漏洞深淵。其實(shí),在我們的一個(gè)應(yīng)用中,是有很多的”NSAutoreleasePool對(duì)象實(shí)例的,就像它的命名一樣,它們用來收集所仃H動(dòng)釋放的對(duì)彖.只耍在調(diào)用”autorelease”方法斤它就會(huì)被加入到這個(gè)池中.4未來的某個(gè)時(shí)刻,-般指在ToundatiorT與AppKit”應(yīng)用一個(gè)事件循環(huán)結(jié)束時(shí),或者在響應(yīng)完”WebObjects類應(yīng)用請(qǐng)求時(shí),或調(diào)用NSAutoreleasePool”對(duì)彖的release方法.這里需耍注總,MNSAutorele
12、asePool并不止一個(gè),為什么需要多個(gè)NSAutoreleasePool”來骨理內(nèi)存呢?因?yàn)?,在一個(gè)代碼段內(nèi)就網(wǎng)收所有H動(dòng)釋放對(duì)彖是很有用處的,多線程應(yīng)用中,每個(gè)線程可以擁有一個(gè)自動(dòng)釋放池的棧,當(dāng)你創(chuàng)建了一堆臨時(shí)對(duì)彖時(shí),而僅僅是在一段很短的上下文中,比如一個(gè)簡(jiǎn)單循環(huán),你并不希望在下面的代碼中,他們?nèi)匀徽加帽氋F的內(nèi)存資源你就可以為這段短小緊湊本地卜.下文創(chuàng)建一個(gè)”NSAutoreleasePool”對(duì)彖來忡理他們:-(id)findSomethingidtheObjectnil;/WhateverwerelookingforNSAutoreleasePool*localPoolNSAutor
13、eleasePoolallocinit;/AutoreleasedobjectsarenowautomaticallyplacedinlocalPool./Loopthatcreatesmanytemporaryobjectswhile(theObject=nil)訐(temporaryobjectmatchesSomeCondition)theObjecttemporaryobjectretain;IIWewantthisone/GetridofallthosetemporaryobjectslocalPoolrelease;returntheObjectautorelease;卜.段代碼我
14、們做了什么:A,我幻創(chuàng)建了-個(gè)”NSAutorelwsePool”對(duì)彖.把它壓到十詢上下文中的內(nèi)存仕理池頂.在它下而的所冇白動(dòng)內(nèi)管理對(duì)彖都被放入到這個(gè)池中.B,我們調(diào)用了門動(dòng)釋放對(duì)糾temporaryobject”的detain”方法,使它的生命周期超過本地池的管理。C, 釋放池操作同時(shí)把它從棧中POPHi.D, 緊摟著,我們又在返回它前調(diào)用了aulorelease”方法.把這個(gè)對(duì)彖放入卅前池棧的TOP池中.這東西有點(diǎn)繞,但原理其實(shí)還算簡(jiǎn)單.如果上面的能明白了,恭喜你,Objective-C的水平又上了一個(gè)臺(tái)階。同理町證.還令一段更輅練的代碼:-(NSArray*)findAListOfThi
15、ngsNSMutab1eArray*thingArray=NSMutableArrayallocinitWithCapacity:25;/Thelistof25thingswerelookingforNSAutoreleasePool*outerPool=NSAutoreleasePoolallocinit;NSAutoreleasePool*innerPool二nil;NSArray*largeObjectArray=nil;idtemporaryObject=nil;NSEnumerator*arrayEnumerator=nil;/Loopsthatcreatemanytemporary
16、objectswhile(thingArraycount!=25)largeObjectArray=selffetchLotsOfObjects;/largeObjectArrayisautoreleasedandcontainedinthe/outerautoreleasepoolarrayEnumerator=.largeObjectArrayobjectEnumeratorJ;/Notethattheenumeratoritselfisatemporaryobject!/ItwillbereleasedbytheouterPool/Createtheinnerpooloneachiter
17、ation.When/apooliscreated,itautomaticallybecomesthe/top”poolonthecurrentthreadfsstackofpools.innerPool=NSAutoreleasePoolallocinit;/autoreleasedobjectsnowgointoinnerPoolwhile(temporaryObject=arrayEnumeratornextObject)if(temporaryObjectmatchesSomeCondition)thingArrayaddObject:temporaryObject:/Collectionsretaintheirmembers/Disposetemporaryobjectscreatedonthisiteration;/
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二手車整備工安全知識(shí)水平考核試卷含答案
- 我國上市公司雙重股權(quán)制度的法律剖析與優(yōu)化路徑
- 變配電運(yùn)行值班員崗前前瞻考核試卷含答案
- 電纜金屬護(hù)套制造工發(fā)展趨勢(shì)競(jìng)賽考核試卷含答案
- 燃?xì)鈨?chǔ)運(yùn)工崗前工作實(shí)操考核試卷含答案
- 白酒原料粉碎工復(fù)測(cè)模擬考核試卷含答案
- 生活垃圾處理工創(chuàng)新實(shí)踐競(jìng)賽考核試卷含答案
- 2026年消毒供應(yīng)室三基三嚴(yán)測(cè)試試題
- 企業(yè)風(fēng)險(xiǎn)管理內(nèi)部控制制度
- 老年術(shù)后患者變異處理的個(gè)體化方案
- 2025年安全生產(chǎn)事故年度綜合分析報(bào)告
- 2026年浦發(fā)銀行社會(huì)招聘參考題庫必考題
- 2026年腹腔鏡縫合技術(shù)培訓(xùn)
- 2026年黑龍江省七臺(tái)河市高職單招職業(yè)適應(yīng)性測(cè)試試題題庫(答案+解析)
- 2025-2030戲劇行業(yè)市場(chǎng)深度調(diào)研及發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告
- 2025年CNC編程工程師年度述職
- 護(hù)坡施工方案審查(3篇)
- 地鐵安檢施工方案(3篇)
- 小學(xué)生寒假心理健康安全教育
- 鋼結(jié)構(gòu)工程全面質(zhì)量通病圖冊(cè)
- 低空智能-從感知推理邁向群體具身
評(píng)論
0/150
提交評(píng)論