Objective-C 內存管理retain和release
阿新 • • 發佈:2017-07-08
計數 nco 優雅 tracking con void sep res 釋放資源
OC使用引用計數來管理內存,每個繼承NSObject的對象,內部都維護了一個引用計數器retainCount。當對象創建時(調用alloc或者new)引用計數器會+1, 手動調用retain()方法能夠使引用計數器+1。手動調用release()方法能夠使引用計數器-1,當引用計數器為0時,對象會自己主動調用"析構函數" dealloc()方法來回收資源和釋放內存。
這樣當一個對象被多個地方使用和管理時,能夠通過retain()將引用計數器+1,來獲取使用權限(防止其它使用者釋放該對象)。用完了之後再通過調用release()將引用計數器-1來放棄使用權限(此時假設引用計數器為0,說明沒有其它地方再使用該對象了。直接會被釋放。假設引用計數器不為0,則證明還有其它地方再使用這個對象,該對象不會被釋放)。
這是一種設計很優雅的內存管理機制,誰使用誰retain()用完之後release(),假設已經沒有人使用它了。引用計數器為0,則釋放掉。
// // Goods.h // 08_Retain&&Release // // Created by apple on 14-11-12. // Copyright (c) 2014年 cc. All rights reserved. // #import <Foundation/Foundation.h> @interface Goods : NSObject @property int price; /** * dealloc方法,對象釋放時會調用。用於資源的回收,相當於C++中的析構函數 * dealloc方法須要重寫父類的方法,實現釋放當前類的資源 */ - (void)dealloc; @end
// // Goods.m // 08_Retain&&Release // // Created by apple on 14-11-12. // Copyright (c) 2014年 cc. All rights reserved. // #import "Goods.h" @implementation Goods - (void)dealloc { //TODO: 釋放資源碼 NSLog(@"[email protected]", self); //須要調用父類來釋放對象 [super dealloc]; } @end
// // main.m // 08_Retain&&Release // // Created by apple on 14-11-12. // Copyright (c) 2014年 cc. All rights reserved. // #import <Foundation/Foundation.h> #import "Goods.h" int main(int argc, const char * argv[]) { @autoreleasepool { //當調用alloc或者new創建一個OC對象時,引用計數+1 Goods* pGoods = [[Goods alloc] init]; //輸出: 1 NSLog(@"retainCount=%lu", (unsigned long)[pGoods retainCount]); //調用retain時引用計數+1 [pGoods retain]; //輸出: 2 NSLog(@"retainCount=%lu", (unsigned long)[pGoods retainCount]); //調用release時引用計數-1 [pGoods release]; //輸出: 1 NSLog(@"retainCount=%lu", (unsigned long)[pGoods retainCount]); //調用release時引用計數-1,此時retainCount為0。內存將被釋放。自己主動調用realloc來釋放資源和內存 [pGoods release]; } return 0; }
Objective-C 內存管理retain和release