應(yīng)用內(nèi)存管理是程序運(yùn)行時(shí)分配內(nèi)存的過程彻桃,使用它并在完成時(shí)釋放它晒屎。好的程序盡可能少使用內(nèi)存肄渗。在Objective-C中后雷,它也可以視為為許多數(shù)據(jù)和代碼分配有限資源的一種方式季惯。當(dāng)通過本文檔完成工作吠各,你會(huì)了解管理應(yīng)用內(nèi)存的知識:管理對象的生命周期并在不需要他們的時(shí)候釋放。
盡管內(nèi)存管理通常被認(rèn)為是單獨(dú)對象層級的勉抓,你的目標(biāo)是管理對象圖(object graphs)贾漏。確保內(nèi)存中的對象不比實(shí)際需要的對象多。
一覽
Objective-C提供兩種方式管理應(yīng)用內(nèi)存藕筋。
- 在本指南中描述的方法纵散,稱為“手動(dòng)保留釋放”或MRR,通過跟蹤對象顯式的管理內(nèi)存對象隐圾。在運(yùn)行時(shí)環(huán)境中伍掀,使用框架類
NSObject
提供的模型,即引用計(jì)數(shù)實(shí)現(xiàn)該方法暇藏。 - 在自動(dòng)引用計(jì)數(shù)器中或ARC中蜜笤,系統(tǒng)使用和MRR相同的引用計(jì)數(shù)器,但它在編譯時(shí)插入適當(dāng)?shù)膬?nèi)存管理方法盐碱。強(qiáng)烈建議在新項(xiàng)目中使用ARC把兔。如果使用ARC,沒有必要理解本文檔中描述的底層實(shí)現(xiàn)瓮顽,雖然在某種情況下有好處县好。關(guān)于ARC的更多信息,參見過渡到ARC釋放文檔(Transitioning to ARC Release Notes)暖混。
防止內(nèi)存相關(guān)問題的最佳實(shí)踐
不正確的內(nèi)存管理會(huì)導(dǎo)致兩種主要類型的問題:
- 釋放或覆蓋仍在使用的數(shù)據(jù)
這將導(dǎo)致內(nèi)存損壞缕贡,通常會(huì)導(dǎo)致應(yīng)用崩潰,更壞的情況儒恋,會(huì)破壞用戶數(shù)據(jù)善绎。 - 沒有釋放不再使用的數(shù)據(jù)導(dǎo)致內(nèi)存泄露
內(nèi)存泄露是分配的內(nèi)存不被釋放,即使它不會(huì)再次使用诫尽。泄露導(dǎo)致應(yīng)用使用的內(nèi)存不斷在增長禀酱,這反過來導(dǎo)致應(yīng)用性能不好或者應(yīng)用被終止。
從引用計(jì)數(shù)器的角度考慮內(nèi)存管理牧嫉,然而剂跟,往往適得其反,因?yàn)槟銉A向在實(shí)現(xiàn)細(xì)節(jié)中考慮內(nèi)存管理而非從實(shí)際目標(biāo)角度酣藻。相反曹洽,你應(yīng)該從對象所有權(quán)和對象圖(object graphs)的角度考慮內(nèi)存管理。
cocoa使用簡單的命名約定來表示方法返回的對象辽剧。
參見內(nèi)存管理策略( Memory Management Policy)送淆。
雖然基本策略很簡單,有一些實(shí)際步驟可以簡化內(nèi)存管理怕轿,并幫助確保程序仍然是可靠的偷崩、健壯的同時(shí)最大限度的減少其資源需求辟拷。
參見實(shí)際內(nèi)存管理(Practical Memory Management)。
自動(dòng)釋放池block提供一種機(jī)制阐斜,你可以向?qū)ο蟀l(fā)送“延遲”釋放消息衫冻。當(dāng)你想要放棄一個(gè)對象的所有權(quán)但要避免立即被回收的可能性時(shí)(例如當(dāng)你從一個(gè)方法返回對象),這是非常有用的谒出。在有些情況下隅俘,你可以使用自己的自動(dòng)釋放池block。
參見使用自動(dòng)釋放池block(Using Autorelease Pool Blocks)笤喳。
使用分析工具調(diào)試內(nèi)存問題
為了在編譯時(shí)識別代碼的問題为居,可以使用Xcode內(nèi)置的Clang靜態(tài)分析器。(use the Clang Static Analyzer)莉测。
如果內(nèi)存管理問題出現(xiàn),還有其他的工具和技術(shù)可以用來識別和診斷的問題颜骤。
- 在技術(shù)文檔TN2239,iOS調(diào)試魔法( iOS Debugging Magic)中描述了許多技術(shù)和工具捣卤,尤其使用
NSZombie
幫助尋找過渡釋放的對象忍抽。 - 你可以使用工具來跟蹤引用計(jì)數(shù)器事件并尋找內(nèi)存泄露。參見在app上收集數(shù)據(jù)(Collecting Data on Your App)董朝。