內(nèi)存管理
ARC 幾乎把所有內(nèi)存管理事宜都交由編譯器來決定, 開發(fā)者只需專注于業(yè)務(wù)邏輯.
理解引用計(jì)數(shù)
OC 語言使用引用計(jì)數(shù)來管理內(nèi)存, 也就是說, 每個(gè)對(duì)象都有個(gè)可以遞增或遞減的計(jì)數(shù)器, 如果想使某個(gè)對(duì)象繼續(xù)存活, 那就遞增其引用計(jì)數(shù), 用完了之后,就遞減其計(jì)數(shù). 計(jì)數(shù)變?yōu)?0, 就表示沒有人關(guān)注此對(duì)象了, 于是,就可以把它銷毀了, 上面這幾句話只是個(gè)概述, 要想寫出優(yōu)秀的 OC 代碼, 必須完全理解此問題才行.
引用計(jì)數(shù)工作原理
在引用計(jì)數(shù)架構(gòu)下, 對(duì)象有個(gè)計(jì)數(shù)器, 用于表示當(dāng)前有多少個(gè)事物令此對(duì)象繼續(xù)存活下去, 這個(gè)在 OC 中叫做'保留計(jì)數(shù)' (retain count), 不過也可以叫做'引用計(jì)數(shù)'(reference count). NSObject 協(xié)議聲明了下面三個(gè)方法用于操作計(jì)數(shù)器, 以遞增或遞減其值,
Retain 遞增保留計(jì)數(shù)
release 遞減保留計(jì)數(shù)
autorelease 待稍后清理 '自動(dòng)釋放池'(autorelease pool)時(shí),再遞減保留計(jì)數(shù).
查看保留計(jì)數(shù)的方法叫做 retainCount ,此方法不太有用.
對(duì)象創(chuàng)建出來時(shí), 其保留計(jì)數(shù)至少為 1,若想令其繼續(xù)存活, 則調(diào)用 retain 方法, 要是某部分代碼不再使用此對(duì)象, 不想令其繼續(xù)存活, 那就調(diào)用 release 或 autorelease 方法, 最終當(dāng)保留計(jì)數(shù)歸零時(shí), 對(duì)象就回收了,也就是說, 系統(tǒng)會(huì)將其占用的內(nèi)存標(biāo)記為 '可重用',此時(shí),所有指向該對(duì)象的引用也都變的無效了.
應(yīng)用程序在其生命期中會(huì)創(chuàng)建很多對(duì)象,這些對(duì)象都互相聯(lián)系著, 例如: 表示個(gè)人信息的對(duì)象會(huì)引用另一個(gè)表示人名的字符串對(duì)象. 而且可能還會(huì)引用其他個(gè)人信息對(duì)象, 于是,這些相互關(guān)聯(lián)的對(duì)象就構(gòu)成了一張'對(duì)象圖',對(duì)象如果持有指向其他對(duì)象的 強(qiáng)引用, 那么前者就 '擁有'后者, 也就是說,對(duì)象想令其所引用的那些對(duì)象繼續(xù)存活,就可將其'保留', 等用完之后,再釋放.
為避免在不經(jīng)意間使用了無效對(duì)象, 一般調(diào)用完 release 之后都會(huì)清空指針, 這就能保證不會(huì)出現(xiàn)可能指向無效的對(duì)象, 這種指針通常稱為 '懸掛指針'(迷途指針,懸垂指針,懸擺指針),
比如 : [object release]; object = nil;
保留環(huán)
使用引用計(jì)數(shù)機(jī)制時(shí), 經(jīng)常要注意的一個(gè)問題是 '保留環(huán)', 也就是 呈環(huán)狀相互引用的多個(gè)對(duì)象, 這將導(dǎo)致 內(nèi)存泄漏,因?yàn)檠h(huán)中的對(duì)象其保留計(jì)數(shù)不會(huì)將為 0, 對(duì)于循環(huán)中的每個(gè)對(duì)象來說,至少還有另外一個(gè)對(duì)象引用者它,在這個(gè)循環(huán)中,所有的對(duì)象的 保留計(jì)數(shù)都是 1.
在 OC 中通常用 弱引用,或是從外界命令循環(huán)中的某個(gè)對(duì)象不再保留另外一個(gè)對(duì)象, 來打破死循環(huán).從而避免內(nèi)存泄漏.
總結(jié):
引用計(jì)數(shù)機(jī)制通過可以遞增遞減的計(jì)數(shù)器來管理內(nèi)存, 對(duì)象創(chuàng)建好之后, 其保留計(jì)數(shù)至少為 1, 若保留計(jì)數(shù)為正,則對(duì)象繼續(xù)存活, 當(dāng)保留計(jì)數(shù)將為 0時(shí), 對(duì)象就會(huì)被銷毀,
在對(duì)象的生命期內(nèi), 其余對(duì)象通過引用來保留 或釋放此對(duì)象, 保留與釋放操作分別會(huì)遞增 及遞減保留計(jì)數(shù).