說(shuō)起內(nèi)存管理,看似老生常談,但是真正掌握內(nèi)存管理并不簡(jiǎn)單缰趋。小伙伴們要加油了。
Objective-C的內(nèi)存管理機(jī)制與Java那種全自動(dòng)的垃圾回收機(jī)制是不同的陕见,它本質(zhì)上還是C語(yǔ)言中的手動(dòng)管理方式秘血,通過(guò)引用計(jì)數(shù)機(jī)制管理內(nèi)存。其內(nèi)存管理方法分為MRC和ARC:
- MRC:手動(dòng)管理內(nèi)存评甜,早期代碼都是使用這個(gè)方式灰粮。
- ARC:自動(dòng)管理內(nèi)存,iOS5之后蘋果提供的一種自動(dòng)管理內(nèi)存的方式忍坷,較好的提升了開(kāi)發(fā)效率(本質(zhì)還是基于MRC的)粘舟。
引用計(jì)數(shù):所謂引用計(jì)數(shù),即在對(duì)象內(nèi)部保存一個(gè)數(shù)字(retain count)佩研,表示該對(duì)象唄引用的次數(shù)柑肴,當(dāng)計(jì)數(shù)為0時(shí)系統(tǒng)會(huì)釋放內(nèi)存中的對(duì)象。
那么哪些操作能夠引起計(jì)數(shù) +1 或者 -1呢旬薯?
- 引用計(jì)數(shù) +1:
- alloc:創(chuàng)建對(duì)象時(shí)調(diào)用此方法晰骑,為對(duì)象開(kāi)辟內(nèi)存空間,對(duì)象引用計(jì)數(shù) +1绊序。
- copy:拷貝一個(gè)對(duì)象硕舆,返回新對(duì)象,被拷貝區(qū)域引用計(jì)數(shù)不變骤公,新的內(nèi)存區(qū)域引用計(jì)數(shù)為1抚官。
- retain:獲得對(duì)象的所有權(quán),引用計(jì)數(shù) +1淋样。
- 引用計(jì)數(shù) -1:
- release:釋放對(duì)象的所有權(quán)耗式,引用計(jì)數(shù) -1胁住,計(jì)數(shù)為0時(shí)對(duì)象被釋放趁猴。
- autorelease:自動(dòng)釋放(在未來(lái)的某個(gè)時(shí)機(jī)釋放)刊咳。
- dealloc:在對(duì)象的引用計(jì)數(shù)為0的時(shí)候調(diào)用,銷毀所開(kāi)辟的內(nèi)存空間儡司,有開(kāi)辟就要有銷毀娱挨。
注意 !
- autorelease是一個(gè)特別的方法捕犬,實(shí)際上是把release消息交給一個(gè)叫做自動(dòng)釋放池(autorelease pool)的東西延遲執(zhí)行跷坝,即在系統(tǒng)覺(jué)得需要清理的時(shí)候,才會(huì)調(diào)用release方法碉碉。
- copy拷?柴钻,一般用于 NSString. 分為深拷貝和淺拷貝,深拷?拷貝的是對(duì)象(內(nèi)容), 淺拷貝拷貝的是指針(地址)垢粮。
內(nèi)存管理的原則
《總的原則:誰(shuí)申請(qǐng)(包括retain)誰(shuí)釋放贴届,引用計(jì)數(shù)最終平衡》
- 凡是通過(guò)retain,alloc蜡吧,copy等手段獲得了所有權(quán)的對(duì)象毫蚓,都必須在你不使用他的時(shí)候調(diào)用release,autorelease等手段來(lái)釋放對(duì)它的所有權(quán)昔善。
- 在一定的代碼段內(nèi)元潘,對(duì)同一個(gè)對(duì)象所作的copy,alloc和retain操作次數(shù)應(yīng)當(dāng)與release和autorelease操作的次數(shù)相等君仆。
- 可以在類的dealloc方法中釋放你所戰(zhàn)友的實(shí)例變量翩概。
- 對(duì)于便利構(gòu)造器和訪問(wèn)器來(lái)說(shuō),并沒(méi)有通過(guò)前面提到的手段獲得對(duì)象的所有權(quán)返咱,因此在這些情況下無(wú)需對(duì)對(duì)象進(jìn)行額外的釋放操作氮帐,切記!
先到這里洛姑,歡迎補(bǔ)充糾正
不定期更新