了解Objective-C 2.0自動(dòng)內(nèi)存管理
了解Objective-C 2.0自動(dòng)內(nèi)存管理是本文要介紹的內(nèi)容,Objective-C 2.0***的增強(qiáng)可能就是垃圾收集了(Garbage Collection)。與“垃圾收集”對(duì)應(yīng)的是傳統(tǒng)的引用計(jì)數(shù)(Reference Count)內(nèi)存管理形式。
使用了垃圾收集意味著大部分情況下《Very simple rules for memory management in Cocoa >>所介紹的工作你在程序中都不需要做了,系統(tǒng)會(huì)自動(dòng)幫你管理好這些問(wèn)題。如果你沒(méi)有閱讀過(guò)《Very simple rules for memory management in Cocoa >>,請(qǐng)先閱讀一下。否則你可能不知道“垃圾收集”說(shuō)的到底是什么。
另外,iPhone的操作系統(tǒng)目前并不支持垃圾收集,如果你希望做iPhone開(kāi)發(fā)或者希望你的程序在未來(lái)移植到iPhone,盡量不要在程序中使用垃圾收集。
什么是垃圾收集?
簡(jiǎn)單說(shuō)來(lái),垃圾收集可以被認(rèn)為是“自動(dòng)內(nèi)存管理”的意思,就是說(shuō)內(nèi)存中不再使用的對(duì)象會(huì)被稱做“垃圾”,垃圾收集的作用就是幫你自動(dòng)釋放掉這些“垃圾”以免程序占用過(guò)多不必要的內(nèi)存。
傳統(tǒng)的內(nèi)存管理形式本站已經(jīng)有所介紹了,所謂垃圾收集主要用于解決內(nèi)存泄露問(wèn)題。當(dāng)你手工建立一個(gè)對(duì)象,而沒(méi)有在不需要的時(shí)候釋放它,那么它就保存在內(nèi)存當(dāng)中。如果創(chuàng)建了很多對(duì)象,那么就需要占用很多內(nèi)存。
少量的內(nèi)存泄露不是很大的問(wèn)題,但是當(dāng)沒(méi)有釋放的內(nèi)存過(guò)多時(shí),就會(huì)出現(xiàn)很大的問(wèn)題了,比如程序運(yùn)行緩慢、占用內(nèi)存過(guò)大等。 如果你程序在持續(xù)運(yùn)行,這些對(duì)象如果沒(méi)有在不需要的時(shí)候被釋放,那么它們就會(huì)慢慢“吃光”你的內(nèi)存。
垃圾收集對(duì)于不知道如何管理內(nèi)存,但是具有很多好點(diǎn)子并且能夠動(dòng)手編寫(xiě)一定程序的人尤為有用。因?yàn)樗麄兛梢院雎缘袈闊┑膬?nèi)存管理,而把大部分時(shí)間關(guān)注于如何實(shí)現(xiàn)一個(gè)可以跑起來(lái)的好點(diǎn)子。
如何使用垃圾收集?
在項(xiàng)目設(shè)置中打開(kāi)垃圾收集選項(xiàng)即可,如圖所示:
說(shuō)明
以下介紹關(guān)于Objective-C 2.0垃圾收集(簡(jiǎn)稱GC)的幾個(gè)關(guān)鍵點(diǎn)。
1、由于垃圾收集包含在Objective-C 2.0 runtime庫(kù)里,所以如果你的程序使用了垃圾收集,那么只能跑在Leopard及以后版本上。
2、默認(rèn)XCode是會(huì)關(guān)閉GC的,要打開(kāi)的話需要修改項(xiàng)目的Build選項(xiàng)。
3、gcc打開(kāi)垃圾收集的參數(shù)是:-fobjc-gc
4、Core Foundation對(duì)象也同樣支持垃圾收集
5、打開(kāi)垃圾收集后,retain、release和autorelease將不再工作。但是如果你的程序中包括這些內(nèi)存管理方法,打開(kāi)GC并不會(huì)影響你的程序。
6、如果你的Objective-C 程序和C、C++共存,那么你可以在用Objective-C的時(shí)候不考慮內(nèi)存釋放,但是在C或者C++時(shí)還是必須考慮內(nèi)存釋放的問(wèn)題。
7、如果在打開(kāi)垃圾收集的情況下明確需要釋放某個(gè)對(duì)象,使用-finalize方法。
8、蘋(píng)果建議***不要同時(shí)支持垃圾收集和傳統(tǒng)的引用計(jì)數(shù),雖然編譯器允許這樣做。
垃圾收集的好處:
1、對(duì)懶人或者初學(xué)者來(lái)說(shuō),你可以不用再考慮對(duì)象是否釋放和什么時(shí)候釋放。這意味著你可以節(jié)省更多時(shí)間,同時(shí)減少出錯(cuò)和內(nèi)存泄露的可能。
2、當(dāng)時(shí)間推移,由于減少了很多工作量和學(xué)習(xí)門檻,可能會(huì)有更多Java或者其他開(kāi)發(fā)人員轉(zhuǎn)入Objective-C開(kāi)發(fā)。
3、使用舊的引用計(jì)數(shù)內(nèi)存管理方式的程序不會(huì)因?yàn)榇蜷_(kāi)了GC而受到任何影響。
4、如果開(kāi)發(fā)多線程程序,相比從前手工進(jìn)行內(nèi)存管理更加簡(jiǎn)單。
垃圾收集的壞處:
1、如果你想讓程序兼容Tiger,那么你就沒(méi)法使用垃圾收集,還是要用引用計(jì)數(shù)的形式編寫(xiě)程序。
2、可能的性能降低。如果你使用過(guò)Java,你可能會(huì)對(duì)垃圾收集對(duì)性能的影響有所了解。不過(guò)這僅僅是壞處之一,因?yàn)榇蟛糠智闆r下你是不會(huì)感覺(jué)到使用了GC的程序有什么速度變慢的問(wèn)題。
3、如果你希望某個(gè)對(duì)象長(zhǎng)期保存而不被釋放,可能需要將其做為全局變量。
4、正如本文前面提到的,iPhone并不支持垃圾收集。如果你希望程序未來(lái)兼容iPhone,那么不要考慮使用垃圾收集。
小結(jié):了解Objective-C 2.0自動(dòng)內(nèi)存管理的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!