關(guān)鍵字:引用計(jì)數(shù)
什么事引用計(jì)數(shù),引用計(jì)數(shù)的原理是什么
引用計(jì)數(shù)是一個(gè)簡(jiǎn)單而有效的管理對(duì)象生命周期的方式。當(dāng)我們創(chuàng)建一個(gè)新對(duì)象的時(shí)候,它的引用計(jì)數(shù)為1。當(dāng)有一個(gè)新的指針指向?qū)ο蟮臅r(shí)候,我們將引用計(jì)數(shù)加1。當(dāng)某個(gè)指針不再指向?qū)ο蟮臅r(shí)候,就將這個(gè)對(duì)象的引用計(jì)數(shù)減1 。注意,當(dāng)對(duì)象的引用計(jì)數(shù)變?yōu)?后再進(jìn)行release操作,引用計(jì)數(shù)將不會(huì)再減1,而是直接銷毀對(duì)象,回收內(nèi)存。引用計(jì)數(shù)的這種管理方式類似于文件系統(tǒng)里面的硬鏈接。在 Linux 文件系統(tǒng)中,我們用 ln 命令可以創(chuàng)建一個(gè)硬鏈接(相當(dāng)于我們這里的retain) ,當(dāng)刪除一個(gè)文件時(shí)(相當(dāng)于我們這里的 release),系統(tǒng)調(diào)用會(huì)檢查文件的 link count 值,如果這個(gè)值大于1 ,則不會(huì)回收文件所占用的磁盤區(qū)域。直到最后一次刪除前,系統(tǒng)發(fā)現(xiàn) link count 值為 1 ,系統(tǒng)才會(huì)執(zhí)行真正的刪除操作,把文件所占用的磁盤區(qū)域標(biāo)記成未使用。
循環(huán)引用問題
引用計(jì)數(shù)這種管理內(nèi)存的方式雖然簡(jiǎn)單,但是也有一個(gè)比較大的瑕疵。就是它并不能很好的解決循環(huán)引用問題。當(dāng)兩個(gè)對(duì)象相互引用了對(duì)方作為自己的成員變量,只有當(dāng)自己銷毀時(shí),才會(huì)將成員變量的引用計(jì)數(shù)減1,兩個(gè)對(duì)象的銷毀都依賴于對(duì)方,就會(huì)造成循環(huán)引用問題,即使外界已經(jīng)沒有任何指針指能夠訪問到他們了,它們也無(wú)法被釋放
不止兩個(gè)對(duì)象存在循環(huán)引用問題,多個(gè)對(duì)象相互引用只要構(gòu)成了閉環(huán),也會(huì)造成循環(huán)引用問題,而在實(shí)際編程中,環(huán)越大就越難被發(fā)現(xiàn)。
檢查是否造成內(nèi)存泄露在Xcode菜單欄選擇"Product"->"Profile",然后選擇"Leaks",再點(diǎn)擊右下角的"Profile"按鈕開始檢測(cè)
使用ARC(Automatic Reference Count)
自動(dòng)引用計(jì)數(shù)(簡(jiǎn)稱ARC),是蘋果WWDC2011年大會(huì)上提出的用于內(nèi)存管理的技術(shù)。
ARC技術(shù)離現(xiàn)在已近很多年了,而且平果現(xiàn)在將MacOS上的垃圾回收機(jī)制(Deprecated),采用ARC代替。說(shuō)明現(xiàn)在的ARC已近相當(dāng)成熟了。使用ARC基本可以不用考慮內(nèi)存泄露的問題。它可以讓你從繁瑣的內(nèi)存管理代碼中解脫出來(lái),用更多的精力來(lái)思考業(yè)務(wù)邏輯、代碼結(jié)構(gòu)、設(shè)計(jì)模式。
ARC固然很好,但對(duì)于初學(xué)者來(lái)說(shuō),不思考內(nèi)存,對(duì)于iOS很多問題就不能深入理解。ARC能夠解決iOS大部分內(nèi)存問題,但它也不是萬(wàn)能的,有些時(shí)候還是需要開發(fā)者自己來(lái)處理的,這主要是與底層的Core Foundation對(duì)象交互的那部分。Core Foundation對(duì)象不受ARC管理,所以需要自己維護(hù)這些對(duì)象的引用計(jì)數(shù)