? 淺談OC的內(nèi)存管理機(jī)制

? ? ? OC采用了引用計(jì)數(shù)(retain count)對(duì)對(duì)象內(nèi)存進(jìn)行管理,例如,某個(gè)對(duì)象alloc了,那么這個(gè)對(duì)象的引用計(jì)數(shù)就加1,retain時(shí)加1,當(dāng)對(duì)象不需要用時(shí)就需要銷毀對(duì)象,釋放內(nèi)存,需要對(duì)象調(diào)用release方法,release會(huì)讓引用計(jì)數(shù)減1,只有引用計(jì)數(shù)消失,相當(dāng)于等于0,對(duì)象才會(huì)調(diào)用dealloc真正銷毀這個(gè)對(duì)象。

? ? ?每個(gè)OC對(duì)象都有自己的引用計(jì)數(shù)器,是一個(gè)整數(shù)表示對(duì)象被引用的次數(shù)钩骇,即現(xiàn)在有多少東西在使用這個(gè)對(duì)象。對(duì)象剛被創(chuàng)建時(shí)边琉,默認(rèn)計(jì)數(shù)器值為1,當(dāng)計(jì)數(shù)器的值變?yōu)?時(shí)记劝,則對(duì)象銷毀变姨。

ARC是xcode5中引入的自動(dòng)引用計(jì)數(shù),其原理與MRC是一樣厌丑,只是系統(tǒng)幫助我們添加了retain和release定欧。

蘋果官方對(duì)于ARC機(jī)制中對(duì)象的內(nèi)存引用規(guī)則:

(1)任何對(duì)象,如果仍有持有者怒竿,就不會(huì)銷毀

(2)任何對(duì)象砍鸠,已經(jīng)沒有任何持有者,即自動(dòng)銷毀

持有者就是指向?qū)ο蟮闹羔樃郏绻莝trong修飾的爷辱,即是對(duì)象的持有者,如果是weak屬性的,則不是持有者

? ? ?現(xiàn)實(shí)中的許多舊的項(xiàng)目饭弓,還有一些比較老的第三方庫(kù)双饥,可能都是采用MRC環(huán)境編寫的,我們?cè)趯?duì)其進(jìn)行擴(kuò)展或者做新項(xiàng)目的兼容的時(shí)候弟断,可以在xcode中對(duì)其進(jìn)行混編咏花。

選擇:target->build phases->compile sources

如果工程是ARC,要混編MRC的文件夫嗓,我們選中compiler flags迟螺,后面設(shè)置為-fno-objc-arc

如果工程是MRC冲秽,要混編ARC文件舍咖,我們?cè)诤竺嬖O(shè)置-fobjc-arc

MRC模式下,所有的對(duì)象都需要手動(dòng)的添加retain锉桑、release代碼來管理內(nèi)存排霉,必須遵守誰創(chuàng)建,誰回收的原則民轴。引用計(jì)數(shù)為0的時(shí)候攻柠,必須回收,如果沒有回收后裸,會(huì)造成內(nèi)存泄露瑰钮,如果繼續(xù)釋放,會(huì)造成野指針微驶。引用計(jì)數(shù)不為0浪谴,不能回收。release后的對(duì)象因苹,雖然已經(jīng)釋放苟耻,但是它的指針地址仍然存在,只是指向了一塊已經(jīng)釋放且無用的內(nèi)存扶檐,所以我們建議release后直接賦個(gè)nil來置空凶杖。

ARC(自動(dòng)引用計(jì)數(shù)),可以自動(dòng)的管理內(nèi)存款筑。在ARC模式下智蝠,只要沒有強(qiáng)指針(強(qiáng)引用)指向?qū)ο螅瑢?duì)象就會(huì)被釋放奈梳。在ARC模式下杈湾,不允許使用retain、release颈嚼、retainCount等方法毛秘。并且,如果使用dealloc方法時(shí),不允許調(diào)用[super dealloc]方法叫挟。ARC**模式下的property變量修飾詞為strong艰匙、weak,相當(dāng)于MRC模式下的retain抹恳、assign员凝。strong :代替retain,缺省關(guān)鍵詞奋献,代表強(qiáng)引用健霹。weak:代替assign,聲明了一個(gè)可以自動(dòng)設(shè)置nil的弱引用瓶蚂,但是比assign多一個(gè)功能糖埋,指針指向的地址被釋放之后,指針本身也會(huì)自動(dòng)被釋放窃这。

ARC機(jī)制的使用規(guī)則

(1)不能使用NSAllocateObjec或NSDeallocateObject函數(shù)來創(chuàng)建對(duì)象

(2)不能在C語言的結(jié)構(gòu)體中使用對(duì)象指針瞳别,同時(shí)建議用object-c的類來管理數(shù)據(jù)而不是結(jié)構(gòu)體

(3)不得使用NSAutoreleasePool對(duì)象。ARC中杭攻,全部使用@autorelease關(guān)鍵字代替祟敛,且比NSAutoreleasePool更高效

(4)不得使用內(nèi)存Zone,那些牽涉NSZone的方法都不得使用。

(5)不得對(duì)一個(gè)屬性變量的取值方法命名以new開頭

(6)outlet均用weak關(guān)鍵字修飾兆解,除非他是xib中最頂部的界面元素馆铁,則需要strong。

(7)Core Foundation不適合ARC锅睛,該創(chuàng)建的仍創(chuàng)建埠巨,該釋放的仍釋放。

其中關(guān)于自動(dòng)釋放池:

? ? ?當(dāng)向一個(gè)對(duì)象發(fā)送一個(gè)autorelease消息時(shí),Cocoa就會(huì)將該對(duì)象的一個(gè)引用放入到最新的自動(dòng)釋放池衣撬。它仍然是個(gè)正當(dāng)?shù)膶?duì)象,因此自動(dòng)釋放池定義的作用域內(nèi)的其它對(duì)象可以向它發(fā)送消息乖订。當(dāng)程序執(zhí)行到作用域結(jié)束的位置時(shí),自動(dòng)釋放池就會(huì)被釋放,池中的所有對(duì)象也就被釋放。

? ? ?Objective-C是通過一種"referring counting"(引用計(jì)數(shù))的方式來管理內(nèi)存的, 對(duì)象在開始分配內(nèi)存(alloc)的時(shí)候引用計(jì)數(shù)為一,以后每當(dāng)碰到有copy,retain的時(shí)候引用計(jì)數(shù)都會(huì)加一, 每當(dāng)碰到release和autorelease的時(shí)候引用計(jì)數(shù)就會(huì)減一,如果此對(duì)象的計(jì)數(shù)變?yōu)榱?, 就會(huì)被系統(tǒng)銷毀.

? ? ?NSAutoreleasePool(MRC)和@autorelease(ARC)就是用來做引用計(jì)數(shù)的管理工作的,這個(gè)東西一般不用你管的. autorelease和release沒什么區(qū)別,只是引用計(jì)數(shù)減一的時(shí)機(jī)不同而已,autorelease會(huì)在對(duì)象的使用真正結(jié)束的時(shí)候才做引用計(jì)數(shù)減一具练。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乍构,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子扛点,更是在濱河造成了極大的恐慌哥遮,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陵究,死亡現(xiàn)場(chǎng)離奇詭異眠饮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)铜邮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門仪召,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寨蹋,“玉大人,你說我怎么就攤上這事扔茅∫丫桑” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵召娜,是天一觀的道長(zhǎng)运褪。 經(jīng)常有香客問我,道長(zhǎng)玖瘸,這世上最難降的妖魔是什么秸讹? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮雅倒,結(jié)果婚禮上璃诀,老公的妹妹穿的比我還像新娘。我一直安慰自己屯断,他們只是感情好文虏,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著殖演,像睡著了一般。 火紅的嫁衣襯著肌膚如雪年鸳。 梳的紋絲不亂的頭發(fā)上趴久,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音搔确,去河邊找鬼彼棍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛膳算,可吹牛的內(nèi)容都是我干的座硕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼涕蜂,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼华匾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起机隙,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤蜘拉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后有鹿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旭旭,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年葱跋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了持寄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片源梭。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖稍味,靈堂內(nèi)的尸體忽然破棺而出咸产,到底是詐尸還是另有隱情,我是刑警寧澤仲闽,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布脑溢,位于F島的核電站,受9級(jí)特大地震影響赖欣,放射性物質(zhì)發(fā)生泄漏屑彻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一顶吮、第九天 我趴在偏房一處隱蔽的房頂上張望社牲。 院中可真熱鬧,春花似錦悴了、人聲如沸搏恤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熟空。三九已至,卻和暖如春搞莺,著一層夾襖步出監(jiān)牢的瞬間息罗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工才沧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迈喉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓温圆,卻偏偏與公主長(zhǎng)得像挨摸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子岁歉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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

  • iOS內(nèi)存管理 概述 什么是內(nèi)存管理 應(yīng)用程序內(nèi)存管理是在程序運(yùn)行時(shí)分配內(nèi)存(比如創(chuàng)建一個(gè)對(duì)象,會(huì)增加內(nèi)存占用)與...
    蚊香醬閱讀 5,704評(píng)論 8 119
  • 內(nèi)存管理 簡(jiǎn)述OC中內(nèi)存管理機(jī)制得运。與retain配對(duì)使用的方法是dealloc還是release,為什么刨裆?需要與a...
    丶逐漸閱讀 1,950評(píng)論 1 16
  • 導(dǎo)讀 一澈圈、為什么要進(jìn)行內(nèi)存管理 二、內(nèi)存管理機(jī)制 三帆啃、內(nèi)存管理原則 四瞬女、MRC手動(dòng)內(nèi)存管理 五、ARC自動(dòng)內(nèi)存管理...
    千山小畻閱讀 2,029評(píng)論 0 7
  • 內(nèi)存管理 ARC處理原理 ARC是Objective-C編譯器的特性努潘,而不是運(yùn)行時(shí)特性或者垃圾回收機(jī)制诽偷,ARC所做...
    b485c88ab697閱讀 11,190評(píng)論 3 47
  • 我們知道經(jīng)過2010年左右的百團(tuán)大戰(zhàn)后坤学,團(tuán)購(gòu)市場(chǎng)上現(xiàn)在僅存兩家企業(yè):美團(tuán)和糯米。在經(jīng)濟(jì)學(xué)上报慕,用“寡頭”來形容這種經(jīng)...
    haolujun閱讀 248評(píng)論 2 2