改定履歷:
2012-05-07-------------新建文本文檔
正文:
本文原文地址
Objective-C內存管理(概覽)
objective-c使用引用計數來跟蹤一個對象是否應被釋放(free).在運行時執行真實的內存釋放(free).
1. 使用"retain"增加引用計數.
[value retain]
2. 使用"release"來減少引用計數
[value release]
一旦計數爲0,運行時做爲垃圾回收該對象內存.
3. "autorelease"也減少對象的引用計數
※ 但即使計數值爲0,除非整個方法調用鏈完成,對象不會被做爲垃圾回收.
[value autorelease]
"setter"方法的內存管理
使用"setter"方法管理引用計數
- (void) setValue: (NSString*)input
{
[value autorelease];
value = [input retain];
}
1. 減少原值"value"的引用計數.
2. 增加新值的引用計數
3. 使用"autorelease"代替"release".
※ 如果我們用同一個舊對象設置變量value的值,在對象"input"的引用計數值再增加之前,第一個"release"可能會釋放(release)其引用計數值,
objective-c靜態和全局變量
創建一個相同類實例間的共享變量:
static MyString* MySingletonInstance;
@implementation MyString
+ (MyString *) instance
if ( MySingletonInstance == nil ) {
MySingletonInstance = [[self alloc] init];
}
return MySingletonInstance;
}
1. 返回該靜態變量:
MyString *v = [MyString instance];
2. 類常量:
int MyConstant;
@implementation MyString
...
3. 初始化靜態或全局變量:
+ (void)initialize
{
// Avoid multiple initialize called by its children
if (self == [MyString class]) {
...
}
}
空對象(Nil Object)
obj1 = nil;
result = [obj1 somemethod];
1. 給Nil對象發送消息將返回一個Nil對象.
2. objective-c提供一個每次都不驗證Nil對象的機制.
實現dealloc方法可選擇的方式如下(Alternative way in implement dealloc):
- (void) dealloc
{
self.value = nil;
[super dealloc];
}
self.value = nil;
調用會自動釋放(release)舊的對象並且設置該變量爲nil的方法是實現dealloc比較好的方式(A preferable way to implement dealloc).
實例變量的域
控制objective-c實例變量的域(scope):
@interface MyString : NSObject
{
char *name;
@private
// Accessible by this class only
char* privateData;
@protected
// Also accessible by children class
float protectedData;
@public
// Accessible by everyone
id publicData;
}
※ 缺省是@protected.
對象關聯
關聯兩個objective-c對象:static char key;
NSString *v1 = [[NSString alloc] init];
NSString *v2 = [[NSString alloc] init];
objc_setAssociatedObject (
v1,
&key,
v2,
OBJC_ASSOCIATION_RETAIN
);
返回關聯的對象:
NSString *associate = (NSString *)objc_getAssociatedObject(v1, &key);
切斷關聯:
objc_setAssociatedObject(v1, &key, nil, OBJC_ASSOCIATION_ASSIGN);