MRC下的內(nèi)存管理

MRC下的內(nèi)存管理

內(nèi)存中的5大區(qū)域

  1. 棧區(qū)

這個(gè)區(qū)的內(nèi)存保存的是局部變量, 當(dāng)作用域結(jié)束后, 系統(tǒng)就會(huì)自動(dòng)回收內(nèi)存.

局部變量num4 = 0x7fff5fbff7bc
  1. 堆區(qū)

這個(gè)區(qū)是用來(lái)程序員通過(guò)代碼來(lái)申請(qǐng)的空間, 這塊空間會(huì)一直保存到程序的結(jié)束, 直到程序員手動(dòng)來(lái)釋放. 內(nèi)存管理只會(huì)管理堆區(qū)上的內(nèi)存.

對(duì)象小明在堆區(qū)的地址是:0x100400200
  1. BSS段

這個(gè)區(qū)的內(nèi)存主要是用來(lái)保存未被初始化的全局變量或靜態(tài)變量, 一旦被初始化后就會(huì)將數(shù)據(jù)轉(zhuǎn)移到數(shù)據(jù)段.同樣是系統(tǒng)自動(dòng)執(zhí)行的.

  1. 數(shù)據(jù)段

這個(gè)區(qū)的內(nèi)存是用來(lái)保存全局變量或靜態(tài)變量, 直到程序結(jié)束才會(huì)被系統(tǒng)自動(dòng)回收.

全局變量num1 = 0x1000011f0
靜態(tài)變量num3 = 0x1000011f4
類地址p1     = 0x1000011c8
  1. 代碼區(qū)

這個(gè)區(qū)的內(nèi)存是用來(lái)存儲(chǔ)程序中的代碼.

函數(shù)指針 p = 0x100000dd0

內(nèi)存管理的必要性

內(nèi)存中的對(duì)象如果不在不用的時(shí)候及時(shí)的回收, 可以想象對(duì)于有限的內(nèi)存來(lái)說(shuō)是不可能實(shí)現(xiàn)的.

例如:iPhone的內(nèi)存警告機(jī)制, 內(nèi)存到40M就會(huì)警告, 如果到了120M就會(huì)閃退.

怎么進(jìn)行內(nèi)存管理

1.相關(guān)概念

如果想對(duì)內(nèi)存進(jìn)行管理, 首先必須理解與內(nèi)存管理相關(guān)的概念.

  • 僵尸對(duì)象與野指針

僵尸對(duì)象: 指的是內(nèi)存中的對(duì)象已經(jīng)被釋放, 但還沒(méi)有被CPU給分配出去.

野指針: C語(yǔ)言中的野指針指的是定義了一個(gè)指針但是沒(méi)有初始化, 導(dǎo)致指針中存儲(chǔ)的是垃圾值, 指向內(nèi)存中的任意地址.
OC中的野指針指的是指針指向的對(duì)象已經(jīng)被回收了, 如果仍有指針指向容易誤操作.

  • 內(nèi)存泄漏

內(nèi)存泄漏: 指的是一個(gè)應(yīng)該被回收的對(duì)象, 沒(méi)有得到及時(shí)的回收. 這樣的對(duì)象會(huì)一直存在于內(nèi)存中 直到程序結(jié)束. 這樣的結(jié)果會(huì)導(dǎo)致內(nèi)存的泄漏.

  • MRC與ARC

MRC: Manual Reference Counting, 指的是Xcode下編寫代碼需要手動(dòng)對(duì)內(nèi)存進(jìn)行管理.

ARC: Automatic Reference Counting, 指的是Xcode下編寫代碼系統(tǒng)會(huì)自動(dòng)的進(jìn)行內(nèi)存管理.

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

引用計(jì)數(shù)器: 所有的OC對(duì)象內(nèi)都有一個(gè)叫做retainCount的屬性, 這個(gè)屬性的默認(rèn)值是1, unsigned long類型.

  • dealloc方法

dealloc方法: 所有的OC對(duì)象在被回收之前都會(huì)系統(tǒng)自動(dòng)調(diào)用dealloc方法

2.內(nèi)存管理

  • 引用計(jì)數(shù)器的使用

引用計(jì)數(shù)器的默認(rèn)值是1, 調(diào)用類的retain方法使引用計(jì)數(shù)器+1, 調(diào)用類的release方法引用計(jì)數(shù)器-1. 當(dāng)引用計(jì)數(shù)器為0時(shí), 對(duì)象就會(huì)被回收.

- (instancetype)retain OBJC_ARC_UNAVAILABLE;
- (oneway void)release OBJC_ARC_UNAVAILABLE;
  • 野指針與僵尸對(duì)象

為了避免野指針指向僵尸對(duì)象造成誤操作, 建議將在指針變成野指針后賦值為nil. 在Xcode下也可以打開(kāi)僵尸對(duì)象檢查, 但是這樣會(huì)很影響程序的性能, 謹(jǐn)慎使用.

  • 內(nèi)存管理原則
  1. 有對(duì)象的創(chuàng)建就要匹配release.
Person *p1 = [Person new];
        
[p1 release];
  1. retain的次數(shù)要和release匹配.
Person *p1 = [Person new];
[p1 retain];
[p1 retain];
[p1 release];
[p1 release];
    
[p1 release];
  1. 為了代碼的規(guī)整, 誰(shuí)用了一個(gè)對(duì)象誰(shuí)就retain, 誰(shuí)不用誰(shuí)就release, 誰(shuí)負(fù)責(zé)retain, 誰(shuí)就負(fù)責(zé)release.

  1. 不要隨便retain, 多一個(gè)人使用的時(shí)候才retain, 少一個(gè)人使用的話就release.
  • 單個(gè)對(duì)象內(nèi)存管理
1. 有對(duì)象的創(chuàng)建 就必須要匹配1個(gè)release.
2. retain次數(shù)和release次數(shù)一定要匹配.
3. 只有在指針?lè)Q為野指針的時(shí)候才賦值為nil
4. 在方法中不要隨意的為傳入的對(duì)象retain.
  • 多個(gè)對(duì)象內(nèi)存管理
1.當(dāng)一個(gè)對(duì)象是另一個(gè)對(duì)象的參數(shù)時(shí)候, 重寫setter方法和dealloc方法
2.對(duì)象作為參數(shù)需要將舊的對(duì)象release, 新的對(duì)象retain
3.同一個(gè)對(duì)象作為參數(shù)被賦值了兩次時(shí)會(huì)造成內(nèi)存泄漏, 所以重構(gòu)setter方法的時(shí)候一定要加入if判斷新舊對(duì)象是否為同一個(gè)對(duì)象
重寫setter和dealloc的標(biāo)準(zhǔn)寫法
- (void)setCar:(Car *)car
     {
         if(_car != car)
         {
            [_car release];
            _car = [car retain];
         }
     }
     
     - (void)dealloc
     {
        [_car release];
        [super dealloc];
     }
  • @property參數(shù)
    MRC下:

a: 多線程相關(guān)

atomic: (默認(rèn)值)setter方法加了一把線程安全鎖, 效率低
nonatomic: 建議使用

b: 與生成setter方法的實(shí)現(xiàn)相關(guān)

assign: (默認(rèn)值) 生成的setter方法的實(shí)現(xiàn)就是直接賦值
retain: 生成的setter就是標(biāo)準(zhǔn)的MRC內(nèi)存管理管理代碼.ps:dealloc內(nèi)的release代碼還需要一樣寫

c: 與生成只讀, 讀寫屬性的相關(guān)

readwrite: (默認(rèn)值)代表同時(shí)生成getter和setter
readonly: 只生成getter, 不會(huì)生成setter

d: 與生成的getter, setter方法相關(guān)

getter=XXX: 重寫getter的方法名
setter=ooo: : 重寫setter方法的名字
在BOOL類型的參數(shù)中重寫getter
  • 類的循環(huán)引用
例如:Person類中有個(gè)Book類屬性, 而B(niǎo)ook類中又有一個(gè)作者(Person)屬性. 這樣在導(dǎo)入頭文件的時(shí)候就會(huì)出現(xiàn)循環(huán)引用.

解決辦法:
其中一邊不要使用#import引入對(duì)方的頭文件.
而是使用@class 類名. 這樣就可以不引用對(duì)方頭文件的情況下, 告訴編譯器這是一個(gè)類.
@class
作用及含義: 相當(dāng)于向編譯器聲明了一個(gè)類, 并沒(méi)有實(shí)現(xiàn)它.(參考c語(yǔ)言的函數(shù)的聲明)

  • 對(duì)象間的相互引用
例如:Person類的小明對(duì)象有本書(shū)<三國(guó)>(Book類), <三國(guó)>對(duì)象有一個(gè)作者屬性是小明(Person類), 這個(gè)時(shí)候就出現(xiàn)了循環(huán)引用.

解決方法:
1端使用retain, 一端使用assign , assign那一邊就不需要release.

ARC下的內(nèi)存管理

ARC概述

Automatic Reference Couunting, 顧名思義是系統(tǒng)會(huì)自動(dòng)幫助我們?nèi)ビ?jì)算引用計(jì)數(shù)器的值, 是WWDC2011和iOS5引入的最大的變革和最激動(dòng)人心的變化.ARC是新的LLVM3.0編譯器的一項(xiàng)特性,使用ARC,可以說(shuō)一舉解決了廣大iOS開(kāi)著所憎恨的手動(dòng)管理內(nèi)存的麻煩.

ARC管理內(nèi)存的原理

  • 強(qiáng)指針與弱指針

默認(rèn)情況下, 我們聲明的指針就是強(qiáng)指針, 或者使用__strong來(lái)顯示的聲明一個(gè)強(qiáng)類型的指針.
弱指針指的是用__weak修飾的指針, 無(wú)論強(qiáng)指針還是弱指針, 作為存儲(chǔ)對(duì)象的地址, 并且通過(guò)指針操作對(duì)象方面上沒(méi)有任何區(qū)別, 唯一的區(qū)別是在對(duì)象回收上, 如果沒(méi)有任何強(qiáng)類型的指針指向的時(shí)候, 對(duì)象就會(huì)回收.

新建一個(gè)項(xiàng)目的話系統(tǒng)會(huì)默認(rèn)開(kāi)啟ARC, 使用ARC的過(guò)程中, 系統(tǒng)會(huì)在編譯的過(guò)程中自動(dòng)的在合適的位置為我們加上
retain, release, autorelease. 對(duì)象會(huì)在沒(méi)有強(qiáng)類型的指針指向的時(shí)候被回收掉, 其本質(zhì)還是對(duì)象的引用計(jì)數(shù)器被減為0了.

ARC與MRC的轉(zhuǎn)換和兼容

ARC和MRC通過(guò)命令-fno-objc-arc可以相互兼容, 通過(guò)Xcode可以將MRC手動(dòng)轉(zhuǎn)成ARC, 由于系統(tǒng)的處理過(guò)于簡(jiǎn)單, 謹(jǐn)慎使用.

ARC與垃圾回收機(jī)制的區(qū)別

垃圾回收機(jī)制GC是在程序的運(yùn)行期間不斷循環(huán)掃描對(duì)象是否無(wú)人使用, 如果沒(méi)有使用就回收.
ARC是在程序編譯的過(guò)程就系統(tǒng)自動(dòng)的加上了一些內(nèi)存管理代碼.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市检盼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俐填,死亡現(xiàn)場(chǎng)離奇詭異蝴光,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)堕仔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)晌区,“玉大人摩骨,你說(shuō)我怎么就攤上這事±嗜簦” “怎么了仿吞?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)捡偏。 經(jīng)常有香客問(wèn)我唤冈,道長(zhǎng),這世上最難降的妖魔是什么银伟? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任你虹,我火速辦了婚禮,結(jié)果婚禮上彤避,老公的妹妹穿的比我還像新娘傅物。我一直安慰自己,他們只是感情好琉预,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布董饰。 她就那樣靜靜地躺著,像睡著了一般圆米。 火紅的嫁衣襯著肌膚如雪卒暂。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,736評(píng)論 1 312
  • 那天娄帖,我揣著相機(jī)與錄音也祠,去河邊找鬼。 笑死近速,一個(gè)胖子當(dāng)著我的面吹牛诈嘿,可吹牛的內(nèi)容都是我干的堪旧。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼奖亚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼淳梦!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起昔字,我...
    開(kāi)封第一講書(shū)人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤爆袍,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后李滴,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體螃宙,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛮瞄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年所坯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挂捅。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芹助,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出闲先,到底是詐尸還是另有隱情状土,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布伺糠,位于F島的核電站蒙谓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏训桶。R本人自食惡果不足惜累驮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望舵揭。 院中可真熱鬧谤专,春花似錦、人聲如沸午绳。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拦焚。三九已至蜡坊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赎败,已是汗流浹背算色。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留螟够,地道東北人灾梦。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓峡钓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親若河。 傳聞我的和親對(duì)象是個(gè)殘疾皇子能岩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 內(nèi)存管理 簡(jiǎn)述OC中內(nèi)存管理機(jī)制。與retain配對(duì)使用的方法是dealloc還是release萧福,為什么拉鹃?需要與a...
    丶逐漸閱讀 1,974評(píng)論 1 16
  • iOS內(nèi)存管理 概述 什么是內(nèi)存管理 應(yīng)用程序內(nèi)存管理是在程序運(yùn)行時(shí)分配內(nèi)存(比如創(chuàng)建一個(gè)對(duì)象,會(huì)增加內(nèi)存占用)與...
    蚊香醬閱讀 5,730評(píng)論 8 119
  • 內(nèi)存管理 ARC處理原理 ARC是Objective-C編譯器的特性,而不是運(yùn)行時(shí)特性或者垃圾回收機(jī)制鲫忍,ARC所做...
    b485c88ab697閱讀 11,217評(píng)論 3 47
  • 為什么進(jìn)行內(nèi)存管理膏燕? 由于移動(dòng)設(shè)備的內(nèi)存極其有限,所以每個(gè)APP所占的內(nèi)存也是有限制的悟民,當(dāng)app所占用的內(nèi)存較多時(shí)...
    天天想念閱讀 898評(píng)論 1 7
  • 別人口中說(shuō)出來(lái)的又或者看到的坝辫,都不一定是真實(shí)的你,所以……我只相信自己去了解的射亏,不屑于去打聽(tīng)又或者試探什么
    0雲(yún)閱讀 105評(píng)論 0 0