(三)iOS 開發(fā)之內(nèi)存管理

內(nèi)存管理是iOS開發(fā)中的重點(diǎn)和難點(diǎn)槐臀,也是技能進(jìn)階的重要關(guān)口葡幸,也常常在面試問題中出現(xiàn)了袁。內(nèi)存管理涉及到的核心話題包括:內(nèi)存的管理規(guī)則、垃圾回收機(jī)制湿颅、內(nèi)存泄漏和循環(huán)引用等等载绿。下面整理了iOS中涉及到的內(nèi)存管理相關(guān)知識(shí)。


(一)iOS 開發(fā)中的內(nèi)存管理規(guī)則

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

OC 中通過引用計(jì)數(shù)來實(shí)現(xiàn)內(nèi)存管理:當(dāng)一個(gè)對象被持有的時(shí)候計(jì)數(shù)加一油航,不再被持有的時(shí)候引用計(jì)數(shù)減一卢鹦,當(dāng)引用計(jì)數(shù)為零的時(shí)候,則將這個(gè)對象釋放劝堪。

  • MRC:手動(dòng)引用計(jì)數(shù),iOS 5 之前的版本采用揉稚。
  • ARC:自動(dòng)引用計(jì)數(shù)秒啦,iOS 5 以及之后的版本采用。
MRC 和 ARC 之間的轉(zhuǎn)換
  • MRC 轉(zhuǎn) ARC :在控制開關(guān)中添加-fobjc-arc 以ARC進(jìn)行編譯搀玖。
  • ARC 轉(zhuǎn) MRC :在控制開關(guān)中添加-fno-objc-arc 以MRC進(jìn)行編譯余境。
自動(dòng)釋放池

OC對象的生命周期取決于引用計(jì)數(shù),我們有兩種方式可以釋放對象:一種是直接調(diào)用release釋放灌诅;另一種是調(diào)用autorelease將對象加入自動(dòng)釋放池中芳来。自動(dòng)釋放池用于存放那些需要在稍后某個(gè)時(shí)刻釋放的對象。

自動(dòng)釋放池中 release 和 drain 的區(qū)別

release 和 drain 的作用是一樣的猜拾,都是清理自動(dòng)釋放池即舌,區(qū)別是:drain 在支持 GC 的系統(tǒng)中(Mac)可以引起 GC 回收操作,而 release 不可以


(二)Objective-C 開發(fā)中的垃圾回收

垃圾回收(Garbage Collection, GC)簡單地說就是程序中及時(shí)處理廢棄不用的內(nèi)存對象的機(jī)制挎袜,防止內(nèi)存中廢棄對象堆積過多造成內(nèi)存泄漏顽聂。

平臺(tái)局限性

Objective-C 語言本身是支持垃圾回收機(jī)制的,但是具有平臺(tái)局限性盯仪,僅限于Mac 桌面系統(tǒng)開發(fā)中紊搪,在iPhone 和 iPad 等蘋果移動(dòng)端開發(fā)中是不支持垃圾回收機(jī)制的。

垃圾回收和引用計(jì)數(shù)的區(qū)別

垃圾回收是宏觀的全景,對整體進(jìn)行內(nèi)存管理:將所有對象看作一個(gè)集合耀石,然后在GC循環(huán)中定時(shí)監(jiān)測活動(dòng)對象和非活動(dòng)對象,及時(shí)將永不倒的非活動(dòng)對象釋放以避免內(nèi)存泄漏爸黄,也就是說將用不到的垃圾對象交給 GC 來管理釋放滞伟,而無需開發(fā)者關(guān)心。
相比于 GC馆纳,引用計(jì)數(shù)是局部性的诗良,是管理每個(gè)對象的引用計(jì)數(shù),單個(gè)對象引用計(jì)數(shù)為0后會(huì)馬上被釋放鲁驶。


(三)僵尸對象

產(chǎn)生原因

一個(gè)引用計(jì)數(shù)為0的Objective-C被釋放后就變成僵尸對象鉴裹,也就是過度釋放的對象。

調(diào)試方法

遇到EXC_BAD_ACCESS 這類問題一般都是僵尸對象引起的,可以開啟僵尸模式(Zombie Objects)定位径荔。具體步驟這里不詳細(xì)給出督禽。


(四)野指針

產(chǎn)生原因

野指針又叫“懸掛指針”,野指針出現(xiàn)的原因是指針沒有賦值总处,或者是指針指向的對象已經(jīng)被釋放掉了狈惫。開發(fā)中應(yīng)該給野指針及時(shí)賦予零值,避免內(nèi)存報(bào)錯(cuò)鹦马。
與空指針區(qū)別:向空指針發(fā)送消息不會(huì)報(bào)錯(cuò)胧谈。

調(diào)試方法

野指針指向一塊隨機(jī)的垃圾內(nèi)存,向它們發(fā)送消息會(huì)報(bào) EXC_BAD_ACCESS 錯(cuò)誤導(dǎo)致程序崩潰荸频×庑ぃ可以開啟僵尸模式(Zombie Objects)定位。具體步驟這里不詳細(xì)給出旭从。


(五)空指針

定義

空指針不用于野指針稳强,它是一個(gè)沒有指向任何內(nèi)容的指針『驮茫空指針是有效的指針退疫,值為 nil、NULL鸽素、Nil 或者0等褒繁,給空指針發(fā)送信息不會(huì)報(bào)錯(cuò),只是不會(huì)相應(yīng)信息而已馍忽。


(六)nil澜汤、Nil、NULL 和 [NSNull null] 的區(qū)別

  • nil:當(dāng)一個(gè)對象置為nil時(shí)舵匾,這個(gè)對象的內(nèi)存地址就會(huì)被系統(tǒng)收回俊抵。置空之后是不能進(jìn)行retain,copy等跟引用計(jì)數(shù)有關(guān)的任何操作的坐梯。
  • Nil:nil完全等同于Nil徽诲,只不過由于編程習(xí)慣,人們一般把對象置空用nil吵血,把類置空用Nil谎替。
  • NULL :這個(gè)是從C語言繼承來的,就是一個(gè)簡單的空指針蹋辅。
  • [NSNull null]:[NSNull null]和nil的區(qū)別在于钱贯,nil是一個(gè)空對象,已經(jīng)完全從內(nèi)存中消失了侦另,而如果我們想表達(dá)“我們需要有這樣一個(gè)容器秩命,但這個(gè)容器里什么也沒有”的觀念時(shí)尉共,我們就用到[NSNull null],它就是為“值為空的對象”弃锐。如果你查閱開發(fā)文檔你會(huì)發(fā)現(xiàn)NSNull這個(gè)類是繼承NSObject袄友,并且只有一個(gè)“+ (NSNull *) null;”類方法霹菊。這就說明NSNull對象擁有一個(gè)有效的內(nèi)存地址剧蚣,所以在程序中對它的任何引用都是不會(huì)導(dǎo)致程序崩潰的。

(七)內(nèi)存泄漏

產(chǎn)生原因

內(nèi)存泄漏指動(dòng)態(tài)分配內(nèi)存的對象在使用完后沒有被系統(tǒng)回收旋廷,導(dǎo)致對象始終占用內(nèi)存鸠按,又無法通過代碼訪問。大量內(nèi)存泄漏會(huì)導(dǎo)致系統(tǒng)內(nèi)存不足的問題饶碘。

解決與調(diào)試方法
  • 對程序員而言待诅,要深入理解內(nèi)存管理原則,養(yǎng)成良好的編程習(xí)慣以減少內(nèi)存泄漏情況的發(fā)生熊镣。
  • 使用 Xcode 提供的檢測調(diào)試工具 Instruments,檢測可能導(dǎo)致內(nèi)存泄漏的代碼募书,并及時(shí)優(yōu)化绪囱。

(八)循環(huán)引用

產(chǎn)生原因

當(dāng)多個(gè)對象相互持有形成一個(gè)封閉的環(huán)時(shí),循環(huán)引用問題隨之出現(xiàn)莹捡,導(dǎo)致內(nèi)存泄漏鬼吵。

解決方法
  • 自己明確知道這里會(huì)存在循環(huán)引用,在合理的位置主動(dòng)斷開環(huán)中的一個(gè)引用(置為nil)篮赢,使得對象得以回收齿椅;
  • 使用弱引用。
iOS 開發(fā)中常出現(xiàn)循環(huán)引用的地方

(九)深拷貝和淺拷貝

淺拷貝只是復(fù)制了內(nèi)存地址纱耻,也就是對內(nèi)存空間的引用芭梯;深拷貝是開辟新的空間并且復(fù)制原空間相同的內(nèi)容,新指針指向新空間內(nèi)容弄喘。
對 immutable 對象進(jìn)行 copy 操作玖喘,是淺拷貝,mutableCopy 操作是深拷貝蘑志;對 mutable 對象進(jìn)行 copy 和 mutableCopy 都是深拷貝累奈。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贬派,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子费尽,更是在濱河造成了極大的恐慌赠群,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旱幼,死亡現(xiàn)場離奇詭異查描,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)柏卤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進(jìn)店門冬三,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缘缚,你說我怎么就攤上這事勾笆。” “怎么了桥滨?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵窝爪,是天一觀的道長。 經(jīng)常有香客問我齐媒,道長蒲每,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任喻括,我火速辦了婚禮邀杏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘唬血。我一直安慰自己望蜡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布拷恨。 她就那樣靜靜地躺著脖律,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腕侄。 梳的紋絲不亂的頭發(fā)上状您,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天,我揣著相機(jī)與錄音兜挨,去河邊找鬼膏孟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拌汇,可吹牛的內(nèi)容都是我干的柒桑。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼噪舀,長吁一口氣:“原來是場噩夢啊……” “哼魁淳!你這毒婦竟也來了飘诗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤界逛,失蹤者是張志新(化名)和其女友劉穎昆稿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體息拜,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡溉潭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了少欺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喳瓣。...
    茶點(diǎn)故事閱讀 40,928評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖赞别,靈堂內(nèi)的尸體忽然破棺而出畏陕,到底是詐尸還是另有隱情,我是刑警寧澤仿滔,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布惠毁,位于F島的核電站,受9級(jí)特大地震影響崎页,放射性物質(zhì)發(fā)生泄漏鞠绰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一实昨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盐固,春花似錦荒给、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蛔趴,卻和暖如春挑辆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背孝情。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人御板。 一個(gè)月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓喉誊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親羔挡。 傳聞我的和親對象是個(gè)殘疾皇子洁奈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評論 2 361

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

  • 軟件運(yùn)行時(shí)會(huì)分配和使用設(shè)備的內(nèi)存資源间唉,因此,在軟件開發(fā)的過程中利术,需要進(jìn)行內(nèi)存管理呈野,以保證高效、快速的分配內(nèi)存印叁,并且...
    maTianHong閱讀 702評論 0 0
  • 內(nèi)存管理ARC處理原理ARC是Objective-C編譯器的特性被冒,而不是運(yùn)行時(shí)特性或者垃圾回收機(jī)制,ARC所做的只...
    陽明先生_X自主閱讀 341評論 0 3
  • 我說各位點(diǎn)單的看官~鹿石咖啡的熱點(diǎn)資訊和原創(chuàng)內(nèi)容會(huì)越來越豐富喉钢,大家稍安勿躁姆打,你們點(diǎn)的看單我們都會(huì)照顧到。這次說些讓...
    鹿石咖啡閱讀 306評論 0 0
  • 文:凌言 01 沈冰在手機(jī)上編輯著信息肠虽,編輯好了自己又看了一遍:劉超幔戏,我們以后不要再聯(lián)系了!你也知道,這段時(shí)間税课,你...
    凌言隨語閱讀 455評論 0 0
  • 寒冷掩蓋不了春天的本色 寒冷過后 春意更濃 陰霾掩蓋不了天空的本色 陰霾過后 藍(lán)天更藍(lán) 苦難掩蓋不了堅(jiān)毅的本色 苦...
    千尹閱讀 2,305評論 49 72