iOS 內(nèi)存管理

內(nèi)存問(wèn)題主要體現(xiàn)在兩個(gè)方面:內(nèi)存溢出和野指針異常

內(nèi)存的五大分區(qū)

棧區(qū) 系統(tǒng)開(kāi)辟,系統(tǒng)釋放,不需要我們管理
堆區(qū) 程序員自己管理的空間,自己申請(qǐng)空間,自己釋放
靜態(tài)區(qū) 將定義變量的類型前加static,則變量的分配在靜態(tài)區(qū)
常量區(qū) 常量數(shù)據(jù)存儲(chǔ)在常量區(qū),常量區(qū)的內(nèi)容不可修改,block就存在于常量區(qū)
代碼區(qū) 所有的語(yǔ)句編譯后生成的CPU指令存儲(chǔ)在代碼區(qū)

引用計(jì)數(shù)機(jī)制

  • 在C語(yǔ)言中,使用molloc和free,進(jìn)行內(nèi)存的創(chuàng)建和釋放。
  • 實(shí)際開(kāi)發(fā)中,可能會(huì)遇到兩個(gè)以上的指針使用同一塊內(nèi)存。C語(yǔ)言無(wú)法記錄內(nèi)存使用者的個(gè)數(shù)
  • OC中采用引用計(jì)數(shù)機(jī)制來(lái)管理內(nèi)存,每個(gè)對(duì)象都有一個(gè)引用計(jì)數(shù)器,用來(lái)計(jì)算當(dāng)前對(duì)象的引用次數(shù)
  • 當(dāng)一個(gè)新的引用指向?qū)ο髸r(shí),引用計(jì)數(shù)就加1,當(dāng)去掉一個(gè)引用時(shí),引用計(jì)數(shù)就減1.當(dāng)引用計(jì)數(shù)到0時(shí)該對(duì)象的系統(tǒng)空間就會(huì)被回收。

引用計(jì)數(shù)

舉例說(shuō)明:

  1. 第一個(gè)人進(jìn)入辦公室的人,需要開(kāi)燈“需要照明的人數(shù)”,計(jì)數(shù)值從0變成1.
  2. 之后每當(dāng)有人進(jìn)入辦公室,“需要照明的人數(shù)”就加1,此時(shí)計(jì)數(shù)值從1變成2.
  3. 每當(dāng)有人下班離開(kāi)辦公室,“需要照明的人數(shù)”就減1,計(jì)數(shù)值從2變成1.
  4. 最后一個(gè)人從下班離開(kāi)辦公室,“需要照明的人數(shù)”減1,計(jì)數(shù)值從1變成0,因此關(guān)燈。
    在OC中“對(duì)象”就相當(dāng)于照明設(shè)備,“開(kāi)燈”就相當(dāng)于生成對(duì)象,需要照明就相當(dāng)于有別的對(duì)象需要持有當(dāng)前對(duì)象,“不需要照明”就相當(dāng)于要釋放對(duì)象的所有權(quán),“關(guān)燈”就相當(dāng)于發(fā)現(xiàn)當(dāng)前對(duì)象沒(méi)有被任何別的對(duì)象持有,就把這個(gè)對(duì)象銷(xiāo)毀,也就是釋放掉這個(gè)對(duì)象所占有的內(nèi)存。

影響引用計(jì)數(shù)的方法

  • +alloc開(kāi)辟內(nèi)存空間,讓被開(kāi)辟的內(nèi)存空間的引用計(jì)數(shù)從0變?yōu)?.
  • -retain引用計(jì)數(shù)j加1,如果對(duì)象之前的引用計(jì)數(shù)為1,retain之后變?yōu)?.
  • -copy把某一對(duì)象的內(nèi)容拷貝一份,原有對(duì)象的引用計(jì)數(shù)不變,新對(duì)象的引用計(jì)數(shù)變1.
  • -release引用計(jì)數(shù)立即減1

內(nèi)存管理原則

  • 凡是使用了alloc,retain,或者copy讓內(nèi)存的引用計(jì)數(shù)增加了,就需要使用release或者autorelease讓內(nèi)存的引用計(jì)數(shù)減少,在一段代碼內(nèi),增加和減少的次數(shù)要相等。
  • 如果增加的次數(shù)大于減少的次數(shù),會(huì)造成內(nèi)存泄漏。
  • 如果增加的次數(shù)小于減少的次數(shù),會(huì)造成過(guò)度釋放。
  • 如果增加的次數(shù)等于減少的次數(shù),還繼續(xù)訪問(wèn),造成野指針的問(wèn)題。

修飾屬性的關(guān)鍵字

strong:強(qiáng)引用,ARC中使用,與MRC中的retain類似。
weak:弱引用,ARC使用,如果對(duì)象釋放了,則指針會(huì)指向nil,避免野指針。
assign:弱引用,基本上應(yīng)用于基本數(shù)據(jù)類型。
copy:拷貝特性,對(duì)象拷貝,需遵循NSCoding協(xié)議mutableCopy是深拷貝,創(chuàng)建了一個(gè)一樣的對(duì)象。
readonly:只讀屬性,只生成getter方法,不生成setter方法。
atotic:原子特性,setter、getter方法在多線程訪問(wèn)下是絕對(duì)安全的,也就是個(gè)setter、getter方法加了線程鎖,保證在同一時(shí)刻只有一個(gè)線程在訪問(wèn)。
nonatotic:非原子特性,setter,getter方法內(nèi)部不會(huì)做任何多線程的訪問(wèn)處理,只是普通的setter、getter,方法。

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1. 內(nèi)總管理原則(引用計(jì)數(shù)) IOS的對(duì)象都繼承于NSObject, 該對(duì)象有一個(gè)方法:retainCount...
    lilinjianshu閱讀 2,247評(píng)論 0 2
  • 一、Manual Reference Counting「手動(dòng)引用計(jì)數(shù)」手動(dòng)內(nèi)存管理 1. 內(nèi)存管理的重要性 移動(dòng)設(shè)...
    _涼風(fēng)_閱讀 578評(píng)論 0 2
  • Objective-C,顧名思義,是一門(mén)超C的語(yǔ)言,自從ARC(Auto Reference Count)出現(xiàn)了之...
    xiao彰閱讀 511評(píng)論 0 2
  • 軟件運(yùn)行時(shí)會(huì)分配和使用設(shè)備的內(nèi)存資源,因此,在軟件開(kāi)發(fā)的過(guò)程中,需要進(jìn)行內(nèi)存管理,以保證高效、快速的分配內(nèi)存,并且...
    Mr_Atom閱讀 740評(píng)論 0 2
  • 原文地址:http://www.itdecent.cn/p/66b5d43b6ac4 軟件運(yùn)行時(shí)會(huì)分配和使用設(shè)備的...
    JinSanPang閱讀 661評(píng)論 0 5

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