OC的內存管理篇1---MRC

OC的內存管理

開始之前, 先思考一個問題:為什么要管理內存?

曾看到一個笑話, 一個程序員去面試iOS程序員,面試官問:iOS開發(fā)中為什么需要內存管理?
程序員淡定地說:內存有限,所以要管理內存啊.

答案很出乎意料,但是仔細想想,真是一語道破了本質.
那在內存有限的情況下, 為什么要管理內存呢?
在iOS開發(fā)中, 我們要保證有限的內存資源得到最大化的利用,當我們創(chuàng)建一個類的對象時, 對應的在內存中,就得到一個塊內存來存放這個對象的內容. 但是這個對象(或者理解成一塊內存), 可能被多個指針變量使用. 不要奇怪, 怎么又出現(xiàn)了指針變量. 這是因為,在objective-C中,我們都是通過對象的引用來操縱內存的. 它本質就是一個指針(該對象在內存中的地址). 這樣做的好處是快呀. 試想, 我們在開發(fā)中, 同一個對象可能被次使用, 如果直接操作對象本身,那么當我們把一個對象賦值給另一個對象的時候,就需要把該對象中的所有內容全部都挨個從該對象所在的內存中取出來,放到另外一塊內存中. 如果,我們使用一個對象的地址來使用對象,那么就僅僅把一個整形值賦值給另外一個對象的引用就OK了.

  • 說了那么多,看一下內存的布局:


    可執(zhí)行文件在內存中的布局

現(xiàn)在我們知道內存管理實際上是管理我們的對象,對于其他的非對象類型不需要內存管理(int,float,,,)
這是為什么呢?
這是因為,堆區(qū)需要程序員手動管理, 棧區(qū)內存由系統(tǒng)負責管理(申請和釋放).實際上,非對象類型的數(shù)據(jù)內容和對象類型的數(shù)據(jù)內容,一個放在棧里面,一個放在堆里面(這里暫時這么理解:其實和變量是否靜態(tài)以及是否是全局有關系), 本質上我們管理內存就是管理堆. 即便后來objective-C退出的ARC機制,也僅僅是為每個對象添加一個自己的引用計數(shù)器.(作用是記錄有多少"人"在使用它,或者說有多少指針在指向這塊內存),當我們創(chuàng)建對象,對象之間相互傳值的時候, 系統(tǒng)自動的加減引用計數(shù)的值代替程序員手動的管理內存.
注意:有些時候, 文中所指的對象和對象引用(指針)為同一概念, 但是對象的本質是對應堆區(qū)中的一塊內存這一點是不變的

回到主題:為什么要管理內存呢?不好回答. 我們可以取反唄, 如果不管理內存會怎么樣?

  1. 如果內存不管理, 那么手機中的內存資源將會被很快的用完.
  2. 如果內存得不到很好的管理, 可能會出現(xiàn)正在使用的對象,但是該對象所對應的內存已經(jīng)被系統(tǒng)釋放,甚至已被分配給別的對象. 造成野指針,甚至數(shù)據(jù)錯誤的現(xiàn)象.
  3. 如果內存得不到很好的管理,可能會出現(xiàn). 對象已經(jīng)沒有被使用了,但還沒有被釋放. 浪費內存.
  4. 如果內存得不到很好的管理,還會出現(xiàn)很多問題...

既然要管理內存,就是要避免出現(xiàn)以上情況

如何管理內存

objective-C中通過引用一個叫做引用計數(shù)器的機制,來管理內存. 它的作用就是記錄當前對象(一塊內存)在程序中,有多少"人"在使用它.或者說有多少指針正在指向它.如果,仍然有指針在指向這塊內存,而此時我們卻釋放了這塊內存,這時候,該指針就成野指針了.
管理內存需要遵循的一些原則:

  1. 自己生成的對象自己持有
  2. 非自己生成的對象自己也能持有
  3. 不在需要自己持有的對象時釋放
  4. 非自己持有的對象不能釋放

在objective-C中都提供一些,供我們持有和釋放以及銷毀內存的方法供程序員使用,以便需要的時候,調用對應的方法來恰當?shù)墓芾韮却?

- (instancetype)retain OBJC_ARC_UNAVAILABLE;
- (oneway void)release OBJC_ARC_UNAVAILABLE;
- (instancetype)autorelease OBJC_ARC_UNAVAILABLE;
- (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE;

+ (instancetype)alloc OBJC_SWIFT_UNAVAILABLE("use object initializers instead");
- (void)dealloc OBJC_SWIFT_UNAVAILABLE("use 'deinit' to define a de-initializer");

分別對應下面的內存管理動作:

  1. 生成并持有 alloc ,new, copy等方法
  2. 持有 retain
  3. 釋放 release
  4. 銷毀 dealloc

在OC中通過alloc類方法,可以生成一個對象.也可以通過使用Copy,mutableCopy 來生成一個對象的副本. 返回一個指向這個對象的指針 , 這個對象是保存在內存中的堆區(qū)的, 可以通過一個相同類型的指針變量來接收這個指針,從而使用它.但是這個指針變量是存儲在棧區(qū)的. 不需要管理, 系統(tǒng)會在"必要的時刻" 彈出棧幀, 這個時候,這個指針變量所指向的內存會release.

生成并持有的使用場景:


引用計數(shù)

到了總結的時候了:也就是說,objective-C中的內存管理,管理的是內存中堆區(qū)中存放的對象,通過為每個對象增添一個引用計數(shù)器來實現(xiàn), 我們需要根據(jù)代碼中有多少引用指向該對象來動態(tài)的增加(向對象發(fā)送retain消息)和減少(向對象發(fā)送release消息)引用計數(shù)器的值.

對于上文中所提到的內存管理需要遵循的原則沒有詳細說明:打算下一篇在ARC中說明.

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鲸睛,隨后出現(xiàn)的幾起案子信柿,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡旺坠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門扮超,熙熙樓的掌柜王于貴愁眉苦臉地迎上來取刃,“玉大人,你說我怎么就攤上這事出刷¤盗疲” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵馁龟,是天一觀的道長崩侠。 經(jīng)常有香客問我,道長坷檩,這世上最難降的妖魔是什么却音? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任改抡,我火速辦了婚禮,結果婚禮上僧家,老公的妹妹穿的比我還像新娘雀摘。我一直安慰自己,他們只是感情好八拱,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涯塔,像睡著了一般肌稻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匕荸,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天爹谭,我揣著相機與錄音,去河邊找鬼榛搔。 笑死诺凡,一個胖子當著我的面吹牛,可吹牛的內容都是我干的践惑。 我是一名探鬼主播腹泌,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼尔觉!你這毒婦竟也來了凉袱?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤侦铜,失蹤者是張志新(化名)和其女友劉穎专甩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钉稍,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡涤躲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了贡未。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片种樱。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖羞秤,靈堂內的尸體忽然破棺而出缸托,到底是詐尸還是另有隱情,我是刑警寧澤瘾蛋,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布俐镐,位于F島的核電站,受9級特大地震影響哺哼,放射性物質發(fā)生泄漏佩抹。R本人自食惡果不足惜叼风,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棍苹。 院中可真熱鬧无宿,春花似錦、人聲如沸枢里。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽栏豺。三九已至彬碱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奥洼,已是汗流浹背巷疼。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留灵奖,地道東北人嚼沿。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像瓷患,于是被迫代替她去往敵國和親骡尽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內容

  • iOS內存管理 概述 什么是內存管理 應用程序內存管理是在程序運行時分配內存(比如創(chuàng)建一個對象,會增加內存占用)與...
    蚊香醬閱讀 5,723評論 8 119
  • ARC在OC里面?zhèn)€人感覺又是一個高大上的牛詞尉尾,在前面Objective-C中的內存管理部分提到了ARC內存管理機制...
    skylor閱讀 728評論 0 2
  • 29.理解引用計數(shù) Objective-C語言使用引用計數(shù)來管理內存爆阶,也就是說,每個對象都有個可以遞增或遞減的計數(shù)...
    Code_Ninja閱讀 1,492評論 1 3
  • 18年剛開年不久沙咏,為了避免自己陷入只是低頭猛跑辨图,卻忘記看路的毛病,年初這個時間點上對自己現(xiàn)階段認為的“剛需”做...
    TIF_eba6閱讀 167評論 1 0
  • 孩子發(fā)皮肢藐、不聽話故河、不好好吃飯、不認真寫作業(yè)吆豹,這些不良的行為總是困擾著做家長的我們鱼的。自己有時候總是控制不住對孩子的暴...
    6_myr閱讀 938評論 0 0