iOS內(nèi)存管理

官方文檔提要:https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html#//apple_ref/doc/uid/10000011i

一道偷、關(guān)于內(nèi)存管理

應(yīng)用程序內(nèi)存管理是在程序運(yùn)行時(shí)分配、使用以及在使用完成后釋放的過(guò)程臭胜。一個(gè)寫得好的程序使用盡可能少的內(nèi)存逐哈。
雖然內(nèi)存管理通常是在單個(gè)對(duì)象的級(jí)別上考慮的饰躲,但您的目標(biāo)實(shí)際上是管理對(duì)象圖薛闪。

iOS內(nèi)存管理示意圖
兩種內(nèi)存管理的方式:

MRC:可以通過(guò)跟蹤自己擁有的對(duì)象來(lái)顯式管理內(nèi)存唇牧。使用引用計(jì)數(shù)的模型來(lái)實(shí)現(xiàn)风范。
ARC:系統(tǒng)使用與MRC相同的引用計(jì)數(shù)系統(tǒng)肾档,但它在編譯時(shí)插入了適當(dāng)?shù)膬?nèi)存管理方法摹恰。(建議使用

兩個(gè)內(nèi)存方面的常見(jiàn)問(wèn)題:

釋放或覆蓋仍在使用的數(shù)據(jù)
這會(huì)導(dǎo)致內(nèi)存損壞,通常會(huì)導(dǎo)致應(yīng)用程序崩潰怒见,或者更糟糕的是用戶數(shù)據(jù)損壞俗慈。

不釋放不再使用的數(shù)據(jù)會(huì)導(dǎo)致內(nèi)存泄漏
內(nèi)存泄漏是分配的內(nèi)存不被釋放的地方,即使它再也不會(huì)被使用遣耍。泄漏導(dǎo)致您的應(yīng)用程序使用越來(lái)越多的內(nèi)存闺阱,這反過(guò)來(lái)可能導(dǎo)致系統(tǒng)性能低下或您的應(yīng)用程序被終止。

二舵变、內(nèi)存管理的基本規(guī)則
1酣溃、你擁有你創(chuàng)建的對(duì)象:

使用一個(gè)以“alloc”、“new”纪隙、“copy”或“mutableCopy”(例如赊豌,alloc、newObject或mutableCopy)開(kāi)頭的方法創(chuàng)建一個(gè)對(duì)象绵咱。

2碘饼、您可以使用retain(strong)獲取對(duì)象的所有權(quán):

通常保證接收到的對(duì)象在接收到的方法中保持有效,并且該方法還可以安全地將對(duì)象返回到其調(diào)用者悲伶。

3艾恼、當(dāng)你不再需要它時(shí),你必須放棄所有權(quán):

通過(guò)發(fā)送release消息或autorelease消息來(lái)放棄對(duì)對(duì)象的所有權(quán)麸锉。

4钠绍、你不能放棄對(duì)你不擁有的物品的所有權(quán)
注意:
1、使用autoRelease延遲釋放
2花沉、你不擁有被引用返回的對(duì)象
3五慈、當(dāng)應(yīng)用程序終止時(shí),對(duì)象可能不會(huì)被發(fā)送dealloc消息主穗。
由于進(jìn)程的內(nèi)存在退出時(shí)會(huì)自動(dòng)清除,所以簡(jiǎn)單地允許操作系統(tǒng)清理資源比調(diào)用所有內(nèi)存管理方法更有效毙芜。
4忽媒、CoreFoundation使用類似當(dāng)不相同的規(guī)則
三、實(shí)用的內(nèi)存管理

1腋粥、使用訪問(wèn)器方法使內(nèi)存管理更容易:
使用方法構(gòu)造器對(duì)實(shí)例變量賦值晦雨;
不要再init和dealloc方法使用方法構(gòu)造器
2架曹、使用weak避免引用循環(huán)
3、避免使用中的對(duì)象被釋放
4闹瞧、不要使用dealloc來(lái)管理稀缺資源
如果不這樣的話绑雄,會(huì)導(dǎo)致以下問(wèn)題

1、tear-down機(jī)制本質(zhì)上是無(wú)序的奥邮,如果對(duì)象被意外釋放執(zhí)行dealloc
例如万牺,tear-down順序可能會(huì)改變,這可能會(huì)導(dǎo)致意外的結(jié)果洽腺。
2脚粟、稀缺資源沒(méi)有被釋放
內(nèi)存泄漏是應(yīng)該修復(fù)的錯(cuò)誤,但它們通常不會(huì)立即致命蘸朋。
然而核无,如果當(dāng)你期望稀缺資源被釋放時(shí),稀缺資源沒(méi)有被釋放藕坯,你可能會(huì)遇到更嚴(yán)重的問(wèn)題团南。
例如,如果應(yīng)用程序耗盡了文件描述符炼彪,用戶可能無(wú)法保存數(shù)據(jù)吐根。
3、清理邏輯在錯(cuò)誤的線程上執(zhí)行霹购。
如果一個(gè)對(duì)象是在一個(gè)意外的時(shí)間自動(dòng)釋放的佑惠,它將被分配在任何線程的自動(dòng)釋放池塊上。
如果它恰好是在對(duì)于只應(yīng)從一個(gè)線程中觸及的資源來(lái)說(shuō)齐疙,這很容易是致命的膜楷。

5、集合擁有它們所包含的對(duì)象(array,dic,set)
添加到集合中時(shí)贞奋,對(duì)象的引用計(jì)數(shù)+1赌厅。
從集合中移除,或者集合本身被釋放時(shí)轿塔,對(duì)象的引用計(jì)數(shù)-1特愿。

四、使用AutoreleasePool
1勾缭、關(guān)于autoreleasePool

autoreleasePool提供了一種機(jī)制揍障,你可以丟掉對(duì)一個(gè)對(duì)象的所有權(quán),但是不會(huì)導(dǎo)致對(duì)象立即被釋放掉俩由。

使用方式:

@autoreleasepool {
    // Code that creates autoreleased objects.
}

在autoreleasepool結(jié)束的時(shí)候毒嫡,在block塊里面被標(biāo)記為autorelease的對(duì)象會(huì)收到一次release消息。
autoreleasepool可以嵌套使用幻梯。
AppKit和UIKit在每次runloop時(shí)兜畸,都會(huì)放到autoreleasepool的block中使用努释。所以一般來(lái)說(shuō)不用顯性的手動(dòng)創(chuàng)建。
除非以下幾種情況:

1咬摇、如果你沒(méi)有基于UI framework寫程序伐蒂,如一個(gè)command-line工具
2、你寫了一個(gè)循環(huán)逸邦,創(chuàng)建了很多的臨時(shí)對(duì)象
此時(shí)你需要?jiǎng)?chuàng)建一個(gè)autoreleasePool,在每次循環(huán)結(jié)束的時(shí)候釋放掉臨時(shí)變量
3龄坪、你創(chuàng)建了一個(gè)輔助線程(貌似只有舊版本會(huì)有問(wèn)題)
2、使用本地自動(dòng)釋放池塊減少峰值內(nèi)存足跡

例子:

NSArray *urls = <# An array of file URLs #>;
for (NSURL *url in urls) {
 
    @autoreleasepool {
        NSError *error;
        NSString *fileContents = [NSString stringWithContentsOfURL:url
                                         encoding:NSUTF8StringEncoding error:&error];
        /* Process the string, creating and autoreleasing more objects. */
    }
}
三健田、Autorelease Pool Block和線程

Cocoa應(yīng)用程序中的每個(gè)線程都維護(hù)自己的Autorelease Pool Block堆棧。如果您正在編寫一個(gè)只有Foundation-only的程序妓局,或者如果分離一個(gè)線程(沒(méi)有使用GCD或者NSThread),則需要?jiǎng)?chuàng)建自己的Autorelease Pool Block好爬。

如果您的應(yīng)用程序或線程壽命很長(zhǎng),并且可能生成大量自動(dòng)釋放的對(duì)象存炮,則應(yīng)該使用自動(dòng)釋放池塊(如AppKit和UIKit在主線程上做);否則穆桂,自動(dòng)釋放的對(duì)象會(huì)積累宫盔,內(nèi)存占用空間也會(huì)增加享完。如果分離的線程不進(jìn)行Cocoa調(diào)用,則不需要使用自動(dòng)釋放池塊般又。

四、NSCopying

NSCOpying協(xié)議聲明了一種提供對(duì)象功能副本的方法茴迁。
“副本”的確切含義可能因類而異,但副本必須是一個(gè)功能獨(dú)立的對(duì)象堕义,其值與復(fù)制時(shí)的原始值相同热某。
用NSCOpying制作的副本由發(fā)送者隱式保留,發(fā)送者負(fù)責(zé)釋放它。

聲明一個(gè)方法昔馋,copyWithZone:,但是復(fù)制通常使用方便方法副本調(diào)用糖耸。復(fù)制方法是為所有NSOBjects定義的秘遏,并簡(jiǎn)單地調(diào)用具有默認(rèn)區(qū)域的copyWithZone:。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嘉竟,一起剝皮案震驚了整個(gè)濱河市邦危,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舍扰,老刑警劉巖倦蚪,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異边苹,居然都是意外死亡陵且,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門个束,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)慕购,“玉大人,你說(shuō)我怎么就攤上這事茬底』Ρ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵阱表,是天一觀的道長(zhǎng)殿如。 經(jīng)常有香客問(wèn)我,道長(zhǎng)最爬,這世上最難降的妖魔是什么涉馁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮烂叔,結(jié)果婚禮上谨胞,老公的妹妹穿的比我還像新娘。我一直安慰自己蒜鸡,他們只是感情好胯努,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著逢防,像睡著了一般叶沛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忘朝,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天灰署,我揣著相機(jī)與錄音,去河邊找鬼。 笑死溉箕,一個(gè)胖子當(dāng)著我的面吹牛晦墙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肴茄,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼晌畅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼抗楔!你這毒婦竟也來(lái)了拦坠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤入热,失蹤者是張志新(化名)和其女友劉穎才顿,沒(méi)想到半個(gè)月后尤蒿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尾组,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年讳侨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了跨跨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片囱皿。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嘱腥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出橱脸,到底是詐尸還是另有隱情,我是刑警寧澤添诉,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布吻商,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏盆偿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一捎稚、第九天 我趴在偏房一處隱蔽的房頂上張望今野。 院中可真熱鬧罐农,春花似錦、人聲如沸涵亏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宠默。三九已至,卻和暖如春搀矫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背采够。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蹬癌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留权她,地道東北人隅要。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓步清,卻偏偏與公主長(zhǎng)得像虏肾,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子封豪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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