iOS學(xué)習(xí)心得之:MRC和ARC簡(jiǎn)單理解

OC內(nèi)存管理有兩種模式:
ARC automatic reference counting 自引用用計(jì)數(shù)
MRC manual reference counting 手動(dòng)引用計(jì)數(shù)

在2011年、IOS5之前,OC的開(kāi)發(fā)只支持MRC模式橄教。
也就是只支持手動(dòng)引用計(jì)數(shù)痢缎。
當(dāng)時(shí)每當(dāng)一個(gè)新的指針引用了一塊堆空間(也就是對(duì)象)
就必須手動(dòng)的把此塊堆空間內(nèi)的 retainCount + 1。
具體操作:

Person* p = [Person new];//默認(rèn)就是1 伦糯,所以這里的p不需要手動(dòng)操作。

Person* p2 = p;
[p2 retain];//將retainCount的值+1;

當(dāng)p2指針不使用此堆空間了你虹。要手動(dòng)把 retainCount 值 - 1
[p2 release];

p不用了,也需要release
[p release];

手動(dòng)計(jì)數(shù)器使用規(guī)則:
誰(shuí)用誰(shuí)retain彤避,誰(shuí)不用誰(shuí)release傅物。

關(guān)于內(nèi)存釋放的本質(zhì):
當(dāng)一塊內(nèi)存釋放的時(shí)候,本質(zhì)上只是給這部分字節(jié)打了標(biāo)簽琉预。并沒(méi)有把字節(jié)里的二進(jìn)制數(shù)據(jù)全部清成0或者1.
所以董饰,當(dāng)一塊內(nèi)存說(shuō)是釋放了,但如果沒(méi)有其他的二進(jìn)制數(shù)據(jù)去填充它圆米,那么它的內(nèi)部數(shù)據(jù)是一直存在的卒暂。

內(nèi)存釋放,數(shù)據(jù)仍然存在娄帖,就會(huì)出現(xiàn)一種僵尸對(duì)象的問(wèn)題也祠。
什么是僵尸對(duì)象?堆空間已經(jīng)被標(biāo)記清空近速,能被其他數(shù)據(jù)使用诈嘿。但此時(shí)此刻堪旧,新的二進(jìn)制數(shù)據(jù)還沒(méi)有進(jìn)來(lái)。
我們此時(shí)用一個(gè)指針指向已經(jīng)標(biāo)記釋放了的堆空間奖亚。這個(gè)就叫僵尸對(duì)象和野指針淳梦。

    At mrc model:
    Person* p = [Person new];
    [p release];//指針指向的堆空間,在代碼級(jí)別已經(jīng)被釋放昔字。
    p.name = @“內(nèi)存就沒(méi)有釋放的概念爆袍,只是打了可以被其他數(shù)據(jù)填充的標(biāo)簽”;
    NSLog(@“%@”,p.name);//但如果沒(méi)有其他的數(shù)據(jù)填充這塊空間,所以在某種條件下(沒(méi)被其他數(shù)據(jù)填充)數(shù)據(jù)仍然存在李滴◇χ妫可以繼續(xù)訪問(wèn)。

關(guān)于dealloc函數(shù)釋放堆空間所坯。
在手動(dòng)模式下:
1谆扎、可以直接調(diào)用dealloc 強(qiáng)制標(biāo)記當(dāng)前堆空間直接被釋放,而不用去管retainCount是否是0.
2芹助、每次調(diào)用release 把 retainCount-1 的同時(shí)會(huì)判斷retainCount的最終值是否是0堂湖,是0接著調(diào)用dealloc函數(shù)標(biāo)記當(dāng)前堆空間釋放。

如何在手動(dòng)模式下状土,避免已經(jīng)被標(biāo)記的堆空間被指針引用并使用呢无蜂?
    因?yàn)楸粯?biāo)記釋放的堆空間,會(huì)在任意時(shí)間內(nèi)被其他數(shù)據(jù)使用蒙谓。所以這對(duì)這個(gè)指針來(lái)說(shuō)是不安全的斥季。
有兩種解決方式:
1、打開(kāi)僵尸對(duì)象檢查機(jī)制【一但這塊堆空間被標(biāo)記釋放了累驮,那么所有的指針都不能使用這塊空間】
2酣倾、將你認(rèn)為可能是指向僵尸堆空間的指針設(shè)置成nil
    OC的實(shí)例函數(shù)比較過(guò)硬,當(dāng)傳入的第一個(gè)參數(shù)谤专,也就是self對(duì)象為nil時(shí)躁锡,函數(shù)也不會(huì)報(bào)錯(cuò)。
    這在.net里會(huì)爆出 【未將對(duì)象引用設(shè)置到對(duì)象實(shí)例】 的錯(cuò)誤的置侍。

ARC:automatic reference counting 自動(dòng)引用計(jì)數(shù)
所有堆空間在新指針引用時(shí)的 retainCount+1 在指針不引用時(shí) retainCount-1映之。
自動(dòng)維護(hù)引用計(jì)數(shù),并標(biāo)記釋放當(dāng)前堆空間蜡坊。不需要程序員去關(guān)心杠输。

補(bǔ)充一點(diǎn):
當(dāng)一塊堆空間被標(biāo)記可以刪除之后,即使暫時(shí)沒(méi)有新的數(shù)據(jù)填充這塊空間秕衙。原來(lái)空間的數(shù)據(jù)也不能【復(fù)活】過(guò)來(lái)重新使用抬伺。
eg:

//引用計(jì)數(shù)1
Person* p = [Person new];
//引用計(jì)數(shù)jian-1,為0 觸發(fā)dealloc灾梦。標(biāo)記釋放
[p release];//
[p retain];//此塊堆空間已經(jīng)被標(biāo)記釋放峡钓,所以對(duì)堆內(nèi)的操作都將無(wú)效妓笙。數(shù)據(jù)馬上就要被釋放了,還操作個(gè)毛線能岩。   
最后編輯于
?著作權(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)店門(mé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)容

  • 多線程彪标、特別是NSOperation 和 GCD 的內(nèi)部原理。運(yùn)行時(shí)機(jī)制的原理和運(yùn)用場(chǎng)景掷豺。SDWebImage的原...
    LZM輪回閱讀 2,009評(píng)論 0 12
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,360評(píng)論 0 35
  • 內(nèi)存管理 簡(jiǎn)述OC中內(nèi)存管理機(jī)制捞烟。與retain配對(duì)使用的方法是dealloc還是release,為什么当船?需要與a...
    丶逐漸閱讀 1,974評(píng)論 1 16
  • 本文首發(fā)于我的個(gè)人博客:「程序員充電站」[https://itcharge.cn]文章鏈接:「?jìng)魉烷T(mén)」[https...
    ITCharge閱讀 32,085評(píng)論 47 185
  • 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