2011年11月11日 星期五

iOS學習_基本的記憶體管理

很快的iOS課程來到第二堂,繼第一堂課後又加深了一些感想:

1. Mac電腦需求越來越急迫。
2. 如果要一邊寫iOS、一邊寫網站、一邊寫Android一定會很痛苦。
---------------------------------------------------------
第二堂課最重要的是『記憶體管理』
1. 若是有建立記憶體空間,便需要進行記憶體管理

NSString *Value = [[NSString alloc] initWithFormat:@"%@",@"ola"];
說明:
- [NSString alloc]為宣告記憶體空間。
- initWithFormat為初始化的方法。

2. 可以藉由Reference Counting來看出被引用的次數

NSString *Value = [[NSString alloc] initWithFormat:@"%@",@"ola"];
[Value retainCount];
說明:
- retainCount方法可以查詢出該物件記憶體空間被引用的次數,若Counting為零,則該空間會被回收。

3. 不良管理將會造成dangling(要使用、但已被回收)與memory leak(不需要了,但沒回收)的問題。
- dangling錯誤訊息為:EXC_BAD_ACCESS,一發生即會造成程式當機。
- memory leak不會立刻造成程式錯誤,但有可能慢慢將手機記憶體耗光而當掉。

4. 若是已經宣告的記憶體空間,被別的指標引用到,則可以手動將引用次數加一(Reference Counting+1),來確保該空間不會被回收

[Value retain];


5. release方法並不是"直接"將該空間釋放,而是將Reference Counting -1

[Value release];


6. 常數、沒有alloc的型態不需要進行記憶體管理,iOS會自行處理。

7. 標準有管理記憶體的類別寫法
h檔

#interface

@interface OlaClass:NSObject{
NSString *name;
}
- (void)setName:(NSString *)vname;
- (NSString *)name;
@end


m檔

#import "OlaClass.h"

@implementation OlaClass

- (void)setName:(NSString *)vname;
{
if (name)
{
[name release];
}
name = vanem;
[name retain];
}

- (NSString *)name;
{
return name;
}

- (void)dealloc
{
[name release];
[super dealloc]
}

@end
說明:
- 寫setter時,若是沒有進行retain,則會造成指定的值釋放記憶體後,產生dangling pointer的問題,所以必須retain,保留該空間。但若都不進行release則會造成Reference Counting不斷加上去,最後產生memory leak問題,所以應在每一次setter的時候先判斷是否存在,進行release。

- 經過上述處理,複寫dealloc方法,並執行release,來將加一的Reference Counting減回去。

8. 若是用合成方法,則可以更快速的完成上述類別
h檔

#interface

@interface OlaClass:NSObject{
NSString *name;
}
@property NSString *name;

@end


m檔

#import "OlaClass.h"

@implementation OlaClass
@synthesize (readwrite, retain ,nonatomic) name;

- (void)dealloc
{
[name release];
[super dealloc]
}

@end
說明:
- 合成方法:h檔加property 、m檔加synthesize
- 讀寫:readwrite(有getter、有setter)
- 讀寫:readonly(只有getter)
- Setter設定:assign(不做記憶體操作)
- Setter設定:retain(做retain並且release)
- Setter設定:copy(做copy並且release)
- 單一性:atomic(考慮多執行緒)
- 單一性:nonatomic(無考慮多執行緒)←通常用這個
- 用合成方法,還是要複寫dealloc

沒有留言:

張貼留言