Objective-C 入門指南 - 記憶體管理

記憶體管理 (memory management) 原本就是開發程式的一項重要課題,但為了讓開發者更容易開發應用程式 (application) ,許多記憶體管理模式陸續被提出來




Objective-C 有數種記憶體管理方式,分別是
  • 手動記憶體管理 (manual reference counting, MRC)
  • 自動釋放池 (autorelease pool)
  • 垃圾回收 (garbage collection)
  • 自動引用計數 (automatic reference counting, ARC)


垃圾回收則是伴隨 Objective-C 2.0 出現的功能,需要在 Xcode 裡設定,我們於此不特別講解。 Xcode 4.2 以後可以使用自動引用計數,這是個相當強大的功能,使開發者無須擔心記憶體管理的問題,系統會自動判斷物件什麼時候不再使用,從而釋放該記憶體空間。


自動引用計數有幾個要點
  • 由編譯器 (compiler) 決定何時使用 retain 、 release 、 autorelease
  • @property 改用 strong 、 weak 取代 retain 、 assign 等
  • NSAutoreleasePool 須改用 @autoreleasepool


Xcode 4.2 (iOS 5) 便是以自動引用計數為預設的記憶體管理模式,我們在這裡介紹從手動記憶體管理到自動釋放池的觀念,講解如何使用 retain 、 release 、 autorelease 等,使讀者往後即便讀到非 ARC 的程式碼也能輕鬆讀懂。


簡單來說,凡是用 alloc 或是用 alloc 、 new 、 copy 、 mutableCopy 起始的方法名稱建立物件 (object) 後,就得自行手動管理記憶體,也就是最後不需要使用該物件時,就得使用 release 或 autorelease 方法 (method) ,例如
[[myObject alloc] init];
...
...
[myObject release];


上例用 alloc 配置 myObject 的記憶體空間,然後用 init 初始化 myObject 物件,最後當 myObject 不需要使用時,便用 release 方法將其引用計數 (reference count) 遞減。當 myObject 的引用計數遞減到 0 之時,系統便會自動呼叫 myObject 的 dealloc ,釋放 myObject 的記憶體空間。


引用計數可用 release 遞減,也可用 retain 遞增。 Cocoa 中也有些方法會遞增、遞減引用計數,例如 NSMutableArray 的 addObject: 與 UIView 的 addSubView: 會遞增引用計數,而 NSMutableArray 的 removeObjectAtIndex: 與 UIView 的 removeFromSuperView: 會遞減引用計數。


自動釋放池將記憶體管理的責任一半給系統,另一半給開發者。使用自動釋放池得先建立 NSAutoreleasePool 物件,例如 demo.m 中
// 建立自動釋放池物件, alloc 為配置記憶體區域, init 為初始化物件
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];


同樣的, alloc 配置 pool 的記憶體空間, init 為初始化 pool 物件。


接著在程式中所有建立的物件都需要使用 autorelease 方法
// 傳遞 autorelease 訊息給 NSString 字串物件
[s1 autorelease];
[s2 autorelease];
[s3 autorelease];


更簡單是建立物件時直接使用 autorelease ,例如
[[[myObject alloc] init] autorelease];


最後,程式執行結束前, pool 使用 drain 方法,使自動釋放池釋放所有記憶體空間
// 傳遞 drain 訊息給自動釋放池物件
[pool drain];


雖然現在的電腦都有足夠多的記憶體,自己練習寫的小程式消耗的記憶體也可能微不足道,但是沒有適當的管理記憶體
,很多時候會造成不可預期的錯誤,往後我們陸續說明 @property 必要的宣告。


好了,記憶體管理大致介紹到這裡,嗯,看了很多 myObjectpools1s2s3 會不會有點煩,這些都是變數 (variable) ,變數是 Objective-C 存放數值 (value) 的地方,接下來我們來看看資本資料型態、物件與指標吧!


中英文術語對照
記憶體管理memory management
應用程式application
手動記憶體管理manual retain-release, MRR
自動釋放池autorelease pool
垃圾回收garbage collection
自動引用計數automatic reference counting, ARC
編譯器compiler
物件object
方法method
引用計數reference count
變數variable
數值value


您可以繼續參考
基礎篇


相關目錄
Objective-C 入門指南
Objective-C 教材
首頁



參考資料
Learning Objective-C: A Primer
The Objective-C Programming Language
Cocoa Fundamentals Guide
Coding Guidelines for Cocoa
Advanced Memory Management Programming Guide
Archives and Serializations Programming Guide

沒有留言: