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

- URL: https://justfly.idv.tw/objective-c%e5%8e%9f%e4%be%86%e9%9c%80%e8%a6%81%e5%81%9a%e8%a8%98%e6%86%b6%e9%ab%94%e7%ae%a1%e7%90%86%ef%bd%9e/
- 日期: 2010-05-21
- 分類: WEB&amp;RIA
- 標籤: iphone, objective-c

剛開始接觸Xcode跟interface builder有點既熟悉又陌生的感覺

基本上我是覺得蠻像FLEX的,只是從AS變成objective-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]
```
