淺談iOS內(nèi)存管理機制

iOS內(nèi)存管理機制的原理是引用計數(shù)询微,引用計數(shù)簡單來說就是統(tǒng)計一塊內(nèi)存的所有權(quán)似袁,當(dāng)這塊內(nèi)存被創(chuàng)建出來的時候淋叶,它的引用計數(shù)從0增加到1,表示有一個對象或指針持有這塊內(nèi)存雕拼,擁有這塊內(nèi)存的所有權(quán)纵东,如果這時候有另外一個對象或指針指向這塊內(nèi)存,那么為了表示這個后來的對象或指針對這塊內(nèi)存的所有權(quán)啥寇,引用計數(shù)加1變?yōu)?偎球,之后若有一個對象或指針不再指向這塊內(nèi)存時,引用計數(shù)減1辑甜,表示這個對象或指針不再擁有這塊內(nèi)存的所有權(quán)衰絮,當(dāng)一塊內(nèi)存的引用計數(shù)變?yōu)?,表示沒有任何對象或指針持有這塊內(nèi)存磷醋,系統(tǒng)便會立刻釋放掉這塊內(nèi)存猫牡。

其中在開發(fā)時引用計數(shù)又分為ARC(自動內(nèi)存管理)和MRC(手動內(nèi)存管理)。ARC的本質(zhì)其實就是MRC邓线,只不過是系統(tǒng)幫助開發(fā)者管理已創(chuàng)建的對象或內(nèi)存空間淌友,自動在系統(tǒng)認(rèn)為合適的時間和地點釋放掉已經(jīng)失去作用的內(nèi)存空間煌恢,原理是一樣的。雖然ARC操作起來很方便震庭,不但減少了代碼量症虑,而且降低了內(nèi)存出錯的概率,但因為ARC不一定會及時釋放归薛,所以程序有時候可能會占用內(nèi)存較大谍憔。而MRC若做得好,通過手動管理主籍,及時釋放掉不需要的內(nèi)存空間习贫,便可保證程序長時間運行在良好狀態(tài)上。

在MRC中會引起引用計數(shù)變化的關(guān)鍵字有:alloc千元,retain苫昌,copy,release幸海,autorelease祟身。(strong關(guān)鍵字只用于ARC,作用等同于retain)

alloc:當(dāng)一個類的對象創(chuàng)建物独,需要開辟內(nèi)存空間的時候袜硫,會使用alloc,alloc是一個類方法挡篓,只能用類調(diào)用婉陷,它的作用是開辟一塊新的內(nèi)存空間,并使這塊內(nèi)存的引用計數(shù)從0增加到1官研,注意秽澳,是新的內(nèi)存空間,每次用類alloc出來的都是一塊新的內(nèi)存空間戏羽,與上一次alloc出來的內(nèi)存空間沒有必然聯(lián)系担神,而且上一次alloc出來的內(nèi)存空間仍然存在,不會被釋放始花。

retain:retain是一個實例方法妄讯,只能由對象調(diào)用,它的作用是使這個對象的內(nèi)存空間的引用計數(shù)加1衙荐,并不會新開辟一塊內(nèi)存空間捞挥,通常于賦值是調(diào)用,如:

對象2=[對象1 retain]忧吟;表示對象2同樣擁有這塊內(nèi)存的所有權(quán)砌函。若只是簡單地賦值,如:對象2=對象1;那么當(dāng)對象1的內(nèi)存空間被釋放的時候讹俊,對象2便會成為野指針垦沉,再對對象2進行操作便會造成內(nèi)存錯誤。

copy:copy同樣是一個實例方法仍劈,只能由對象調(diào)用厕倍,返回一個新的對象,它的作用是復(fù)制一個對象到一塊新的內(nèi)存空間上贩疙,舊內(nèi)存空間的引用計數(shù)不會變化讹弯,新的內(nèi)存空間的引用計數(shù)從0增加到1,也就是說这溅,雖然內(nèi)容一樣组民,但實質(zhì)上是兩塊內(nèi)存,相當(dāng)于克隆悲靴,一個變成兩個臭胜。其中copy又分為淺拷貝、深拷貝和真正的深拷貝癞尚,淺拷貝只是拷貝地址與retain等同耸三;深拷貝是拷貝內(nèi)容,會新開辟新內(nèi)存浇揩,與retain不一樣仪壮;真正的深拷貝是對于容器類來說的,如數(shù)組類临燃、字典類和集合類(包括可變和不可變)睛驳,假設(shè)有一個數(shù)組類對象,普通的深拷貝會開辟一塊新內(nèi)存存放這個對象膜廊,但這個數(shù)組對象里面的各個元素的地址卻沒有改變也就是說數(shù)組元素只是進行了retain或者淺拷貝而已,并沒有創(chuàng)建新的內(nèi)存空間淫茵,而真正的深拷貝爪瓜,不但數(shù)組對象本身進行了深拷貝,連數(shù)組元素都進行了深拷貝匙瘪,即為各個數(shù)組元素開辟了新的內(nèi)存空間铆铆。

release:release是一個實例方法,同樣只能由對象調(diào)用丹喻,它的作用是使對象的內(nèi)存空間的引用計數(shù)減1薄货,若引用計數(shù)變?yōu)?則系統(tǒng)會立刻釋放掉這塊內(nèi)存。如果引用計數(shù)為0的基礎(chǔ)上再調(diào)用release碍论,便會造成過度釋放谅猾,使內(nèi)存崩潰;

autorelease:autorelease是一個實例方法,同樣只能由對象調(diào)用税娜,它的作用于release類似坐搔,但不是立刻減1,相當(dāng)于一個延遲的release敬矩,通常用于方法返回值的釋放概行,如便利構(gòu)造器。autorelease會在程序走出自動釋放池時執(zhí)行弧岳,通常系統(tǒng)會自動生成自動釋放池(即使是MRC下)凳忙,也可以自己設(shè)定自動釋放池,如:

@autoreleasepool{ obj= [[NSObject alloc]init]; [obj autorelease]; }

當(dāng)程序走出“}”時obj的引用計數(shù)就會減1.

除了以上所述的關(guān)鍵字禽炬,還有一些方法會引起引用計數(shù)的變化涧卵,如UI中父視圖添加、移除子視圖瞎抛,導(dǎo)航控制器或視圖控制器推出新的視圖控制器以及返回艺演,容器類(數(shù)組、字典和集合)添加和移除元素桐臊。

當(dāng)子視圖添加到父視圖上時胎撤,子視圖的引用計數(shù)加1,移除時引用計數(shù)減1断凶,若父視圖引用計數(shù)變?yōu)?內(nèi)存被釋放伤提,其所有的子視圖都會被release一次,即引用計數(shù)減1认烁,原則上只有這三種情況子視圖的引用計數(shù)會發(fā)生變化肿男,其他如父視圖引用計數(shù)的加減都不會影響到子視圖。

容器類的情況與視圖類似却嗡,添加元素舶沛,該元素引用計數(shù)加1,移除元素窗价,該元素引用計數(shù)減1如庭,容器引用計數(shù)變?yōu)?所占用內(nèi)存被釋放,容器所有元素release撼港,引用計數(shù)減1坪它,其他情況下容器本身的引用計數(shù)變化不會影響到容器內(nèi)元素的引用計數(shù)變化。

導(dǎo)航控制器或視圖控制器推出新的視圖控制器會使被推出的視圖控制器的引用計數(shù)加1帝牡,該視圖控制器返回的時候引用計數(shù)減1往毡,具體方法如下:

導(dǎo)航控制器推出視圖控制器調(diào)用方法:- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;

返回時同樣用導(dǎo)航控制器調(diào)用方法:- (UIViewController *)popViewControllerAnimated:(BOOL)animated;

視圖控制器推出視圖控制器調(diào)用方法:- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion

返回時被推出的視圖控制器調(diào)用方法:- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion

應(yīng)注意:當(dāng)一個對象的引用計數(shù)變?yōu)?占用內(nèi)存被釋放時,會調(diào)用- (void)dealloc方法靶溜,所以如果在MRC下自定義類开瞭,必須在該方法里將該類中屬性關(guān)鍵字設(shè)置為retain或copy的屬性release一次懒震,以免造成內(nèi)存泄露,重寫方法不要忘記在第一行添加[super dealloc]惩阶;挎狸。

親,贊一下唄??么么噠.jpg

如果需要跟我交流的話:
※ Github: https://github.com/wsl2ls
※ 個人博客:https://wsl2ls.github.io
※ 簡書:http://www.reibang.com/u/e15d1f644bea
※ 微信公眾號:iOS2679114653
※ QQ:1685527540

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末断楷,一起剝皮案震驚了整個濱河市锨匆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冬筒,老刑警劉巖恐锣,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舞痰,居然都是意外死亡土榴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門响牛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玷禽,“玉大人,你說我怎么就攤上這事呀打∈噶蓿” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵贬丛,是天一觀的道長撩银。 經(jīng)常有香客問我,道長豺憔,這世上最難降的妖魔是什么额获? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮恭应,結(jié)果婚禮上抄邀,老公的妹妹穿的比我還像新娘。我一直安慰自己昼榛,他們只是感情好撤摸,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著褒纲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钥飞。 梳的紋絲不亂的頭發(fā)上莺掠,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音读宙,去河邊找鬼彻秆。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的唇兑。 我是一名探鬼主播酒朵,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼扎附!你這毒婦竟也來了蔫耽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤留夜,失蹤者是張志新(化名)和其女友劉穎匙铡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碍粥,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡鳖眼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了嚼摩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钦讳。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖枕面,靈堂內(nèi)的尸體忽然破棺而出愿卒,到底是詐尸還是另有隱情,我是刑警寧澤膊畴,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布掘猿,位于F島的核電站,受9級特大地震影響唇跨,放射性物質(zhì)發(fā)生泄漏稠通。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一买猖、第九天 我趴在偏房一處隱蔽的房頂上張望改橘。 院中可真熱鬧,春花似錦玉控、人聲如沸飞主。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碌识。三九已至,卻和暖如春虱而,著一層夾襖步出監(jiān)牢的瞬間筏餐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工牡拇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留魁瞪,地道東北人穆律。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像导俘,于是被迫代替她去往敵國和親峦耘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

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

  • 內(nèi)存管理 簡述OC中內(nèi)存管理機制旅薄。與retain配對使用的方法是dealloc還是release辅髓,為什么?需要與a...
    丶逐漸閱讀 1,948評論 1 16
  • 37.cocoa內(nèi)存管理規(guī)則 1)當(dāng)你使用new赋秀,alloc或copy方法創(chuàng)建一個對象時利朵,該對象的保留計數(shù)器值為1...
    如風(fēng)家的秘密閱讀 829評論 0 4
  • iOS內(nèi)存管理機制的原理是引用計數(shù),引用計數(shù)簡單來說就是統(tǒng)計一塊內(nèi)存的所有權(quán)猎莲,當(dāng)這塊內(nèi)存被創(chuàng)建出來的時候绍弟,它的引用...
    醉了個舟閱讀 276評論 1 1
  • 內(nèi)存管理的基本范圍和概念. 程序運行過程中藥創(chuàng)建大量的對象, 和其他高級語言類似,在ObjC中對象存儲在堆區(qū),程序...
    ValienZh閱讀 867評論 0 2
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,125評論 29 470