[objective-c]教程二-----objective-c 域,空對象和靜態變量

改定履歷:

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);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章