應用的內存管理是指在你的程序運行和使用時申請內存,并在使用完畢后釋放內存的過程。好的程序會盡可能地減少對內存的占用。在Objective-C中,通過一些數(shù)據(jù)和代碼分發(fā)有限的內存資源的擁有權是很常見的。當你完成了本教程后,你就會明白,你需要通過明確地管理對象的生存周期并在他們不再被需要的時候釋放它們,來對你的應用進行內存管理。
盡管內存管理通常是在獨立對象的層級被考慮的,但你的目標是明確地管理對象圖(在面向對象編程中,一組的對象通過它們之間的關系——包括直接引用或一串間接引用組成的網(wǎng)絡。這么一組對象就被叫做對象圖)。你需要確保內存里不要留有你需要之外的對象。

內存管理圖片示例
驚鴻一瞥
Objective-C提供兩種內存管理方法:
- 本教程介紹的方法,通常被叫做“手動保持釋放”或“MRR”,需要你明確地通過跟蹤對象狀態(tài)來管理內存。實現(xiàn)的方法是使用是使用一種被叫做“引用計數(shù)”的方式,由基礎類NSObject結合運行時環(huán)境來提供。
- 在自動引用計數(shù),或被稱作ARC(Automatic Reference Counting)中,系統(tǒng)使用和MRR一樣的引用計數(shù)模式,但它是在編譯期才將合適的內存管理方法調用插入到代碼中。我們強烈推薦你在新的工程項目中使用ARC方法。當你在使用ARC的時候,就幾乎沒有必要理解本文檔討論的實現(xiàn)機制,盡管在某些場合下理解這些機制還是非常重要的。要想更多地了解ARC,請參考轉換到ARC的使用要點。
避免內存管理方面的問題需要多次實踐
有兩種主要的問題會導致內存管理方便的錯誤:
- 釋放或覆蓋仍在使用中的數(shù)據(jù)
這將導致內存非法操作,并且通常會導致應用崩潰,或者,用戶數(shù)據(jù)丟失。 - 不再使用的數(shù)據(jù)不釋放,導致內存泄露
內存泄漏是指向操作系統(tǒng)申請的內存空間即使再也不會用到了,也不釋放。內存泄漏會導致你的應用占用越來越多的內存空間,這樣會影響在配置較差機器上的性能表現(xiàn),或者直接導致應用被終止。
從引用計數(shù)的角度去考慮內存管理往往會適得其反,因為你會陷在內存管理實現(xiàn)的細節(jié)問題上,而不是真正的目的上。實際上,你應該從對象的依賴關系及對象圖的角度去考慮內存管理的問題。
當你獲得一個由函數(shù)返回的對象時,Cocoa使用一種直接的命名慣例來標明。
參考內存管理方法。
盡管基本辦法直截了當,但你還是可以采用很多使用的步驟來簡化內存管理,并且?guī)椭_保你的程序的可靠性和健壯性,并較少配置需求。
參考內存管理實踐。
自動釋放池語法塊提供了一種機制,憑借這種機制你可以給一個對象發(fā)送一個“延遲的”釋放消息。在你準備放棄對一個對象的擁有權,但又想避免立即釋放該對象時,這種機制非常有用(例如當你從一個方法中返回一個對象時)。你也許會想要使用你自己的自動釋放池語法塊。
參考使用自動釋放池語法塊。
使用分析工具解決內存問題
你可以使用Xcode內建的Clang Static Analyzer工具在代碼的編譯器就找出問題。
如果內存管理問題確實產生了,可以使用這些工具和技術來找出并診斷疑難問題。
- 大多數(shù)工具和技術都在技術手冊TN2239,iOS調試魔法中被討論過了——特別推薦使用NSZombie來輔助發(fā)現(xiàn)過多次釋放的對象。
- 你可以使用Instruments來跟蹤引用技術事件,并查找內存泄漏。參考收集App的數(shù)據(jù)。