iOS內(nèi)存管理原理

關(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ù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 29.理解引用計(jì)數(shù) Objective-C語(yǔ)言使用引用計(jì)數(shù)來(lái)管理內(nèi)存,也就是說(shuō),每個(gè)對(duì)象都有個(gè)可以遞增或遞減的計(jì)數(shù)...
    Code_Ninja閱讀 1,737評(píng)論 1 3
  • 1.遠(yuǎn)古時(shí)代的故事那些經(jīng)歷過(guò)手工管理內(nèi)存(MRC)時(shí)代的人們,一定對(duì) iOS 開發(fā)中的內(nèi)存管理記憶猶新。那個(gè)時(shí)候大...
    MissHector閱讀 245評(píng)論 0 1
  • 內(nèi)存管理 簡(jiǎn)述OC中內(nèi)存管理機(jī)制。與retain配對(duì)使用的方法是dealloc還是release,為什么?需要與a...
    丶逐漸閱讀 2,081評(píng)論 1 16
  • 現(xiàn)在iOS開發(fā)已經(jīng)是ARC甚至是swift的時(shí)代,但是內(nèi)存管理仍是一個(gè)重點(diǎn)關(guān)注的問題,如果只知盲目開發(fā)而不知個(gè)中原...
    碼代碼的小馬閱讀 623評(píng)論 0 1

友情鏈接更多精彩內(nèi)容