iOS內存管理機制

  • 內存管理機制的原理是引用計數(shù)

一. Objective-C提供了兩種內存管理方式:
  1. MRC,手動引用計數(shù)器(manual reference counting)

  2. ARC山害,自動引用計數(shù)(automatic reference counting)

  3. 引用計數(shù)簡單來說就是統(tǒng)計一塊內存的所有權,當這塊內存被創(chuàng)建出來的時候,它的引用計數(shù)從0增加到1颂砸,表示有一個對象或指針持有這塊內存,擁有這塊內存的所有權死姚,如果這時候有另外一個對象或指針指向這塊內存人乓,那么為了表示這個后來的對象或指針對這塊內存的所有權,引用計數(shù)加1變?yōu)?都毒,之后若有一個對象或指針不再指向這塊內存時色罚,引用計數(shù)減1,表示這個對象或指針不再擁有這塊內存的所有權账劲,當一塊內存的引用計數(shù)變?yōu)?戳护,表示沒有任何對象或指針持有這塊內存金抡,系統(tǒng)便會立刻釋放掉這塊內存。

  4. 其中在開發(fā)時引用計數(shù)又分為ARC(自動內存管理)和MRC(手動內存管理)腌且。ARC的本質其實就是MRC梗肝,只不過是系統(tǒng)幫助開發(fā)者管理已創(chuàng)建的對象或內存空間,自動在系統(tǒng)認為合適的時間和地點釋放掉已經(jīng)失去作用的內存空間铺董,原理是一樣的巫击。雖然ARC操作起來很方便,不但減少了代碼量精续,而且降低了內存出錯的概率坝锰,但因為ARC不一定會及時釋放,所以程序有時候可能會占用內存較大重付。而MRC若做得好什黑,通過手動管理,及時釋放掉不需要的內存空間堪夭,便可保證程序長時間運行在良好狀態(tài)上。

二. 在MRC中會引起引用計數(shù)變化的關鍵字有:alloc拣凹,retain森爽,copy,release嚣镜,autorelease爬迟。(strong關鍵字只用于ARC,作用等同于retain)

當對象被創(chuàng)建(alloc菊匿、new或copy等方法)時付呕,其引用計數(shù)初始值為1;
給對象發(fā)送retain消息跌捆,其引用計數(shù)加1徽职;
給對象發(fā)送release消息,其引用計數(shù)減1佩厚;
當對象引用計數(shù)歸0時姆钉,ObjC給對象發(fā)送dealloc消息銷毀對象。

  • alloc:當一個類的對象創(chuàng)建抄瓦,需要開辟內存空間的時候潮瓶,會使用alloc,alloc是一個類方法钙姊,只能用類調用毯辅,它的作用是開辟一塊新的內存空間,并使這塊內存的引用計數(shù)從0增加到1煞额,注意思恐,是新的內存空間沾谜,每次用類alloc出來的都是一塊新的內存空間,與上一次alloc出來的內存空間沒有必然聯(lián)系壁袄,而且上一次alloc出來的內存空間仍然存在类早,不會被釋放。

  • retain:retain是一個實例方法嗜逻,只能由對象調用涩僻,它的作用是使這個對象的內存空間的引用計數(shù)加1,并不會新開辟一塊內存空間栈顷,通常于賦值是調用逆日,如:
    對象2=[對象1 retain];表示對象2同樣擁有這塊內存的所有權萄凤。若只是簡單地賦值室抽,如:對象2=對象1;那么當對象1的內存空間被釋放的時候靡努,對象2便會成為野指針坪圾,再對對象2進行操作便會造成內存錯誤。

  • copy:copy同樣是一個實例方法惑朦,只能由對象調用兽泄,返回一個新的對象,它的作用是復制一個對象到一塊新的內存空間上漾月,舊內存空間的引用計數(shù)不會變化病梢,新的內存空間的引用計數(shù)從0增加到1,也就是說梁肿,雖然內容一樣蜓陌,但實質上是兩塊內存,相當于克隆吩蔑,一個變成兩個钮热。其中copy又分為淺拷貝、深拷貝和真正的深拷貝烛芬,淺拷貝只是拷貝地址與retain等同霉旗;深拷貝是拷貝內容,會新開辟新內存蛀骇,與retain不一樣厌秒;真正的深拷貝是對于容器類來說的,如數(shù)組類擅憔、字典類和集合類(包括可變和不可變)鸵闪,假設有一個數(shù)組類對象,普通的深拷貝會開辟一塊新內存存放這個對象暑诸,但這個數(shù)組對象里面的各個元素的地址卻沒有改變也就是說數(shù)組元素只是進行了retain或者淺拷貝而已蚌讼,并沒有創(chuàng)建新的內存空間辟灰,而真正的深拷貝,不但數(shù)組對象本身進行了深拷貝篡石,連數(shù)組元素都進行了深拷貝芥喇,即為各個數(shù)組元素開辟了新的內存空間。

  • release:release是一個實例方法凰萨,同樣只能由對象調用继控,它的作用是使對象的內存空間的引用計數(shù)減1,若引用計數(shù)變?yōu)?則系統(tǒng)會立刻釋放掉這塊內存胖眷。如果引用計數(shù)為0的基礎上再調用release武通,便會造成過度釋放,使內存崩潰珊搀;

  • autorelease:autorelease是一個實例方法冶忱,同樣只能由對象調用,它的作用于release類似境析,但不是立刻減1囚枪,相當于一個延遲的release,通常用于方法返回值的釋放劳淆,如便利構造器眶拉。autorelease會在程序走出自動釋放池時執(zhí)行,通常系統(tǒng)會自動生成自動釋放池(即使是MRC下)憔儿,也可以自己設定自動釋放池,如:
    @autoreleasepool{
    obj= [[NSObject alloc]init];
    [obj autorelease];
    }
    當程序走出“}”時obj的引用計數(shù)就會減1.

三. 自動釋放池
  • Autoreleasepool的原理
    自動釋放池放可,系統(tǒng)有一個現(xiàn)成的自動內存管理池谒臼,它會隨著每一個mainRunloop的結束而釋放其中的對像;
    自動釋放池也可以手動創(chuàng)建耀里,它可以讓pool中的對象在執(zhí)行完代碼后馬上被釋放蜈缤,可以起到優(yōu)化內存,防止內存溢出的效果(如視頻針圖片的切換時冯挎、創(chuàng)建大量臨時對象時等)
    autorelease:自動釋放底哥,使對象在超出指定的生存范圍時能夠自動并正確地釋放 (release 即是立即釋放)

如:循環(huán)內產(chǎn)生大量的臨時對象,直至循環(huán)結束才釋放房官,可能導致內存泄漏趾徽。因此,在循環(huán)中創(chuàng)建自己的autoReleasePool翰守,及時釋放占用內存大的臨時變量孵奶,減少內存占用峰值

for (int i = 0; i < 10000; i ++) {
  @autoreleasepool {
    Person* person = [[Person alloc] init];
    [person eat];          
  }
}
  • 從mrc到arc的轉變
    項目 -> Build Phases -> Compile Sources 找到要修改的文件
    如果是ARC工程添加MRC文件則輸入:-fno-objc-arc
    如果是MRC工程添加ARC文件則輸入:-fobjc-arc
四. block內存管理

block本身是像對象一樣可以retain,和release蜡峰。但是了袁,block在創(chuàng)建的時候朗恳,它的內存是分配在棧(stack)上,而不是在堆(heap)上载绿。

1. @property(copy, nonatomic) void(^block)(void);
mrc中 copy會把block從棧上移動到堆上粥诫。

2. @property(strong, nonatomic) void(^block)(void);
arc即時由強引用strong將其從棧復制到堆

block在一開始是處在stack上的,這是為了考慮到效率的原因崭庸,但是怀浆,有時候是需要block的生命周期長于一開始的stack,這時冀自,我們就通過copy block 來將block復制到heap揉稚。

arc中默認的對象聲明都是strong性質的,在兩個或兩個以上的類相互引用時熬粗,會導致循環(huán)引用搀玖,其中一方需要用weak修飾,才不會造成retainCycle驻呐,如:delegate 屬性用weak聲明灌诅;mrc中即用assign修飾 。
在block中引用block所屬的類含末、實例變量或類的屬性也會導致循環(huán)引用

self.block = ^{
    [self doSomething];
 };

arc中用__weak修飾self猜拾、mrc中用__block修飾,如下代碼:

__weak ViewController* weakSelf = self;//arc
//__block ViewController* weakSelf = self;//mrc
self.block = ^{
   [weakSelf doSomething];
};
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市佣盒,隨后出現(xiàn)的幾起案子挎袜,更是在濱河造成了極大的恐慌,老刑警劉巖肥惭,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盯仪,死亡現(xiàn)場離奇詭異,居然都是意外死亡蜜葱,警方通過查閱死者的電腦和手機全景,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牵囤,“玉大人爸黄,你說我怎么就攤上這事〗伊郏” “怎么了炕贵?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長野崇。 經(jīng)常有香客問我鲁驶,道長,這世上最難降的妖魔是什么舞骆? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任钥弯,我火速辦了婚禮径荔,結果婚禮上,老公的妹妹穿的比我還像新娘脆霎。我一直安慰自己总处,他們只是感情好,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布睛蛛。 她就那樣靜靜地躺著鹦马,像睡著了一般。 火紅的嫁衣襯著肌膚如雪忆肾。 梳的紋絲不亂的頭發(fā)上荸频,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機與錄音客冈,去河邊找鬼旭从。 笑死,一個胖子當著我的面吹牛场仲,可吹牛的內容都是我干的和悦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渠缕,長吁一口氣:“原來是場噩夢啊……” “哼鸽素!你這毒婦竟也來了?” 一聲冷哼從身側響起亦鳞,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤馍忽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后燕差,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遭笋,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年谁不,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徽诲。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡刹帕,死狀恐怖,靈堂內的尸體忽然破棺而出谎替,到底是詐尸還是另有隱情偷溺,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布钱贯,位于F島的核電站挫掏,受9級特大地震影響,放射性物質發(fā)生泄漏秩命。R本人自食惡果不足惜尉共,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一褒傅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧袄友,春花似錦殿托、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鸠按,卻和暖如春礼搁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背目尖。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工馒吴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卑雁。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓募书,卻偏偏與公主長得像,于是被迫代替她去往敵國和親测蹲。 傳聞我的和親對象是個殘疾皇子莹捡,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內容

  • iOS內存管理機制的原理是引用計數(shù),引用計數(shù)簡單來說就是統(tǒng)計一塊內存的所有權扣甲,當這塊內存被創(chuàng)建出來的時候篮赢,它的引用...
    且行且珍惜_iOS閱讀 5,240評論 19 133
  • 對于OC的使用者來說,最會被問到的就是iOS開發(fā)中的內存管理琉挖。而只要涉及到內存管理启泣,就肯定會涉及到property...
    zkhCreator閱讀 1,800評論 4 18
  • 一、MRC(手動引用計數(shù)): 不像 java 有垃圾回收機制示辈,Objective-C 繼承于 C 寥茫,使用一套基于對...
    Lee堅武閱讀 982評論 0 51
  • 原文地址:http://www.reibang.com/p/66b5d43b6ac4 軟件運行時會分配和使用設備的...
    JinSanPang閱讀 640評論 0 5
  • iOS中內存管理機制是開發(fā)中一項很重要的知識,了解iOS中內存管理的規(guī)則不管是在開發(fā)中還是在學習中都能很大程度的幫...
    Horson19閱讀 1,205評論 0 4