應(yīng)用程序在其生命周期中會(huì)創(chuàng)建很多對(duì)像脐彩,這些對(duì)象都相互聯(lián)系著,這些相互關(guān)聯(lián)的對(duì)象就構(gòu)成了一張”對(duì)象圖“皆疹,對(duì)象如果持有指向其他對(duì)象的強(qiáng)引用闽铐,那么前者就擁有會(huì)者蝶怔。
對(duì)象所占用的內(nèi)存在解除分配之后,只是放回可用內(nèi)存池兄墅,如果執(zhí)行時(shí)尚未復(fù)寫(xiě)對(duì)象內(nèi)存踢星,那么該對(duì)象扔然有效。
調(diào)用release會(huì)立刻遞減對(duì)象的保留計(jì)數(shù)而且還有可能令系統(tǒng)回收此對(duì)象隙咸,然而有時(shí)候可以不調(diào)用他沐悦,改為調(diào)用autorelease,此方法會(huì)在稍后遞減計(jì)數(shù)五督。
autorelease能延長(zhǎng)對(duì)象生命期藏否,使其在跨越方法調(diào)用邊界后依然可以存活一段時(shí)間。
引用計(jì)數(shù)機(jī)制通過(guò)可以遞增遞減的計(jì)數(shù)器來(lái)管理內(nèi)存充包,對(duì)象創(chuàng)建好之后副签,其保留計(jì)數(shù)至少為1遥椿,若保留計(jì)數(shù)為正,則對(duì)象繼續(xù)存活淆储,當(dāng)保留計(jì)數(shù)降為0時(shí)冠场,對(duì)象就銷(xiāo)毀了。
clang編譯器項(xiàng)目帶有一個(gè)"靜態(tài)分析器"本砰,用于致命程序里引用計(jì)數(shù)出問(wèn)題的地方碴裙。
ARC管理對(duì)象生命周期的辦法基本就是:在合適的地方插入”保留“及”釋放“操作,在ARC環(huán)境下点额,變量的內(nèi)存管理語(yǔ)義可以通過(guò)修飾符指明舔株,而原來(lái)則需要手工執(zhí)行保留和釋放操作。
ARC只負(fù)責(zé)oc對(duì)象的內(nèi)存咖楣,corefoundation管不了督笆。
在dealloc方法里芦昔,應(yīng)該做的事情就是釋放指向其他對(duì)象的引用诱贿,并取消原來(lái)訂閱的通知,不要做其他任何事咕缎。
如果對(duì)象持有文件描述符等系統(tǒng)資源珠十,那么應(yīng)該專(zhuān)門(mén)編寫(xiě)一個(gè)方法來(lái)釋放此種資源,這樣的類(lèi)要和其他使用者約定凭豪,用完資源后必須調(diào)用close方法焙蹭。
執(zhí)行異步任務(wù)的方法不應(yīng)該在dealloc里調(diào)用。只能在正常狀態(tài)下執(zhí)行的那些方法也不應(yīng)該在dealloc里調(diào)用嫂伞。因?yàn)榇藭r(shí)對(duì)象已經(jīng)處于正在回收的狀態(tài)里孔厉。
捕獲代碼時(shí),一定要注意將try塊內(nèi)所創(chuàng)立的對(duì)象清理干凈帖努。
在默認(rèn)情況下撰豺。arc不生成安全處理異常所需要的清理代碼,開(kāi)啟編譯器標(biāo)志后拼余,可生成這種代碼污桦,不過(guò)會(huì)導(dǎo)致應(yīng)用程序變大,而且會(huì)降低運(yùn)行效率匙监。
將某些引用設(shè)為weak凡橱,可以避免出現(xiàn)保留環(huán)
unsafe_unretained 與weak屬性,再起所指的對(duì)象回收以后表現(xiàn)出來(lái)的行為不同亭姥,unsafe_unretained屬性扔然指向那個(gè)已經(jīng)回收的實(shí)例稼钩,而weak屬性則指向nil。
自動(dòng)釋放池排布在棧中达罗。對(duì)象收到autorelease消息后坝撑。系統(tǒng)將其放入最頂端的池里
開(kāi)啟僵尸對(duì)象方法:編輯應(yīng)用程序scheme,在對(duì)話框左側(cè)選擇run,然后切換至diagnostics,勾選enable zombie objects绍载。
- (void)setFoo:(id)foo{
[foo retail];
[_foo release];
_foo = foo;
}
strong 類(lèi)型指針诡宗。此方法將保留新值并釋放舊值,然后更新實(shí)例變量击儡,另其指向新值塔沃,加入還未保留新值就是放舊值,而且兩個(gè)值又指向同一個(gè)對(duì)象阳谍,那么先執(zhí)行release操作就可能導(dǎo)致系統(tǒng)將此對(duì)象永久回收蛀柴,