【iOS面試糧食】內(nèi)存管理

本文章將記錄Objective-C中內(nèi)存管理的相關(guān)資料,如有錯誤歡迎指出~

iOS的內(nèi)存管理一般指的是OC對象的內(nèi)存管理纳决,因為OC對象分配在堆內(nèi)存,堆內(nèi)存需要程序員自己去動態(tài)分配和回收;基礎(chǔ)數(shù)據(jù)類型(非OC對象)則分配在棧內(nèi)存中,超過作用域就會由系統(tǒng)檢測回收缨伊。如果我們在開發(fā)過程中,對內(nèi)存管理得不到位进宝,就有可能造成內(nèi)存泄露刻坊。

Objective-C中提供了兩種內(nèi)存管理機(jī)制:MRC(MannulReference Counting)ARC(Automatic Reference Counting)MRC指的是手動內(nèi)存管理党晋,在開發(fā)過程中需要開發(fā)者手動去編寫內(nèi)存管理的代碼紧唱;ARC指的是自動內(nèi)存管理活尊,在此內(nèi)存管理模式下由LLVM編譯器和OC運行時庫生成相應(yīng)內(nèi)存管理的代碼

引用計數(shù)

不管是MRC 還是 ARC 漏益,都是通過對引用計數(shù)來進(jìn)行內(nèi)存管理的。

  • 創(chuàng)建一個新對象的時候深胳,它的引用計數(shù)為 1
  • 當(dāng)有一個新的指針指向這個對象時绰疤,其引用計數(shù)加 1
  • 當(dāng)某個指針不再指向這個對象是,其引用計數(shù)減 1舞终,當(dāng)對象的引用計數(shù)變?yōu)?0 時轻庆,說明這個對象不再被任何指針指向了,這個時候就可以將對象銷毀敛劝,回收內(nèi)存余爆。
memory-ref-count.jpg

當(dāng)一個對象使用完沒有釋放,此時其引用計數(shù)永遠(yuǎn)大于1夸盟。該對象就會一直占用其分配在堆內(nèi)存的空間蛾方,就會導(dǎo)致內(nèi)存泄露。內(nèi)存泄露到一定程度有可能導(dǎo)致內(nèi)存溢出上陕,進(jìn)而導(dǎo)致程序崩潰桩砰。

MRC(MannulReference Counting)

先了解下 內(nèi)存管理的思想

  • 自己生成的對象,自己持有释簿。
  • 非自己生成的對象亚隅,自己也能持有。
  • 不再需要自己持有的對象時釋放對象庶溶。
  • 非自己持有的對象無法釋放煮纵。

從上面的思想來看,我們對對象的操作可以分為三種:創(chuàng)建偏螺,持有行疏,釋放,再加上廢棄砖茸,一共有四種隘擎。它們所對應(yīng)的Objective-C的方法和引用計數(shù)的變化是:

對象操作 Objecctive-C方法 引用計數(shù)的變化
生成并持有對象 alloc/new/copy/mutableCopy等方法 +1
持有對象 retain方法 +1
釋放對象 release方法 -1
廢棄對象 dealloc方法

ARC (Automatic Reference Counting)

ARC機(jī)制下,編譯器就可以自動進(jìn)行內(nèi)存管理凉夯,減少了開發(fā)的工作量货葬。但是仍有一些問題需要我們?nèi)プ⒁狻?/p>

循環(huán)引用(Reference Cycle)問題

引用計數(shù)這種管理內(nèi)存的方式雖然很簡單,但是有一個比較大的瑕疵劲够,即它不能很好的解決循環(huán)引用問題震桶。如下圖所示:

  • 對象 A 和對象 B,相互引用了對方作為自己的成員變量征绎,只有當(dāng)自己銷毀時蹲姐,才會將成員變量的引用計數(shù)減 1磨取。
  • 因為對象 A 的銷毀依賴于對象 B 銷毀,而對象 B 的銷毀與依賴于對象 A 的銷毀柴墩,這樣就造成了我們稱之為循環(huán)引用(Reference Cycle)的問題
  • 這兩個對象即使在外界已經(jīng)沒有任何指針能夠訪問到它們了忙厌,它們也無法被釋放。
memory-cycle-1.jpg

不止兩對象存在循環(huán)引用問題江咳,多個對象依次持有對方逢净,形式一個環(huán)狀,也可以造成循環(huán)引用問題歼指,而且在真實編程環(huán)境中爹土,環(huán)越大就越難被發(fā)現(xiàn)。下圖是 4 個對象形成的循環(huán)引用問題踩身。

memory-cycle-2.png

那該怎么解決循環(huán)引用的問題呢赛蔫?使用弱引用 (weak reference) 的辦法牺勾。

弱引用

使用弱引用來持有對象讯泣,弱引用雖然持有對象嗦枢,但是并不增加引用計數(shù),這樣就避免了循環(huán)引用的產(chǎn)生赁濒。

在 iOS 開發(fā)中轨奄,弱引用通常在 delegate 模式中使用。舉個例子來說拒炎,

  • 兩個 ViewController A 和 B挪拟,ViewController A 需要彈出 ViewController B,讓用戶輸入一些內(nèi)容击你,當(dāng)用戶輸入完成后玉组,ViewController B 需要將內(nèi)容返回給 ViewController A。
  • 這個時候丁侄,View Controller 的 delegate 成員變量通常是一個弱引用惯雳,以避免兩個 ViewController 相互引用對方造成循環(huán)引用問題,
memory-cycle-4.jpg

弱引用的實現(xiàn)原理是:

  • 系統(tǒng)對于每一個有弱引用的對象鸿摇,都維護(hù)一個表來記錄它所有的弱引用的指針地址石景。
  • 當(dāng)一個對象的引用計數(shù)為 0 時,系統(tǒng)就通過這張表拙吉,找到所有的弱引用指針潮孽,繼而把它們都置成 nil。

面試題

面試題請參考 這篇文章 iOS 內(nèi)存管理相關(guān)面試題

參考

理解 iOS 的內(nèi)存管理

《Objective-C 高級編程》干貨三部曲(一):引用計數(shù)篇

iOS之從MRC到ARC內(nèi)存管理詳解

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末筷黔,一起剝皮案震驚了整個濱河市往史,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌佛舱,老刑警劉巖椎例,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挨决,死亡現(xiàn)場離奇詭異,居然都是意外死亡订歪,警方通過查閱死者的電腦和手機(jī)脖祈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陌粹,“玉大人撒犀,你說我怎么就攤上這事√椭龋” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵荆姆,是天一觀的道長蒙幻。 經(jīng)常有香客問我,道長胆筒,這世上最難降的妖魔是什么邮破? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮仆救,結(jié)果婚禮上抒和,老公的妹妹穿的比我還像新娘。我一直安慰自己彤蔽,他們只是感情好摧莽,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著顿痪,像睡著了一般镊辕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚁袭,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天征懈,我揣著相機(jī)與錄音,去河邊找鬼揩悄。 笑死卖哎,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的删性。 我是一名探鬼主播亏娜,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼镇匀!你這毒婦竟也來了照藻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤汗侵,失蹤者是張志新(化名)和其女友劉穎幸缕,沒想到半個月后群发,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡发乔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年熟妓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栏尚。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡起愈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出译仗,到底是詐尸還是另有隱情抬虽,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布纵菌,位于F島的核電站阐污,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏咱圆。R本人自食惡果不足惜笛辟,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望序苏。 院中可真熱鬧手幢,春花似錦、人聲如沸忱详。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽踱阿。三九已至管钳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間软舌,已是汗流浹背才漆。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留佛点,地道東北人醇滥。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像超营,于是被迫代替她去往敵國和親鸳玩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,093評論 1 32
  • 1.遠(yuǎn)古時代的故事那些經(jīng)歷過手工管理內(nèi)存(MRC)時代的人們演闭,一定對 iOS 開發(fā)中的內(nèi)存管理記憶猶新不跟。那個時候大...
    MissHector閱讀 207評論 0 1
  • 1. 引子 那些經(jīng)歷過手工管理內(nèi)存(MRC)時代的人們,一定對 iOS 開發(fā)中的內(nèi)存管理記憶猶新米碰。那個時候大約是 ...
    i愛吃土豆的貓閱讀 258評論 0 0
  • 前言 什么是內(nèi)存管理窝革?是指軟件運行時對計算機(jī)內(nèi)存資源的分配和使用的技術(shù)购城。其最主要的目的是如何高效,快速的分配虐译,并且...
    齊滇大圣閱讀 31,437評論 8 96
  • 2016年初,移動視頻直播進(jìn)入高速井噴式的發(fā)展厢拭±加ⅲ縱觀國內(nèi)視頻直播發(fā)展歷程,從9158供鸠、YY箭昵、六間房等PC秀場娛樂直...
    cici_fec7閱讀 1,253評論 0 1