[objective-C]原來需要做記憶體管理~

LINEで送る
[`evernote` not found]

剛開始接觸Xcode跟interface builder有點既熟悉又陌生的感覺
基本上我是覺得蠻像FLEX的,只是從AS變成objective-C
同樣有物件導向的概念,但是語法上卻天差地遠…

首先我就一直不懂那個宣告中的星號是幹嘛的
有點後悔以前C沒有好好學…
後來知道原來在objective-C中幾乎不是宣告實體的物件,而是宣告指標指向物件的記憶體位置

NSString *string = [[NSString alloc] init];

這一句翻成中文應該就是說
宣告一個NSString類別名叫string的指標,指向一個被初始化成NSString類別所需要的記憶體空間的記憶體位置
其中alloc就是在配置string所需的記憶體空間

而每一個繼承NSObject的物件都會有一個retainCount來紀錄該物件被參考的次數
當retainCount值為0時,該記憶體就會被釋放掉(其實應該說他會自動執行一個dealloc的函數,把記憶體釋放掉)

在程式中我們也可以用retain來增加retainCount或用release減少retainCount值

NSString *string = [[NSString alloc] init];
 
NSLog(@”retain count = %d”, [string retainCount]); // retain count = 1
 
[string retain];
 
NSLog(@” retain count = %d”,[string retainCount]); // retain count = 2
 
[string release];
 
NSLog(@” retain count = %d”,[string retainCount]); // retain count = 1


這樣坐在管理記憶體上市比較嚴謹,卻比較麻煩
所以如果用這個方式來宣告

NSString *string = [NSString stringWithFormat:@"test string"];

翻成中文應該就是說
宣告一個NSString類別名叫string的指標,指向一個NSString類別中以stringWithFormat方法放入字串“test string”的記憶體位置
這類方法所建立的物件我們不用手動release
當該物件被建立的同時它就被丟進一個叫做autoreleasePool的地方
而這個autoreleasePool通常會在Xcode自動產生的main.m中自己宣告

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

如果不是用類似stringWithFormat這種方法加入autoreleasePool的話
也可以在之後傳給物件autorelease訊息
也會有一樣的效果(就是把自己丟到autoreleasePool中)

NSString *string = [[NSString alloc] init];
[string autorelease]

在autoreleasePool中的物件會在autoreleasePool收到drain訊息時自動釋放

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 
NSString *string = [[NSString alloc] init];
[string autorelease]
 
[pool drain]

2 則迴響於《[objective-C]原來需要做記憶體管理~

回應已關閉。