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 必要的宣告。
好了,記憶體管理大致介紹到這裡,嗯,看了很多 myObject 、 pool 、 s1 、 s2 、 s3 會不會有點煩,這些都是變數 (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
沒有留言:
張貼留言