assign, copy, retain - 仔細看看怎麼回事

用@property不就完了麼,爲啥要自己寫Getter和Setter?

有些時候需要在getter和setter方法中加入些特別的操作。


最簡單的getter和setter

- (SomeVariable)someValue
{
    return someValue;
}

- (void)setSomeValue:(SomeVariable)aSomeVariableValue
{
    someValue = aSomeVariableValue;
}

如果我們把nonatomic, assign的property展開,就能得到以上的getter和setter。

@property (nonatomic, assign) SomeVariable someValue;

以上對於primitive type和其他非對象類數據結構管用。例如:基礎數據類型char、int、float、long、double、或者Objective C的能被回收的對象(只在Mac上纔有GC,iOS上就木有了)

那咱要是展開個retain的property,那getter和setter會是啥樣子呢

- (void)setSomeInstance:(SomeClass *)aSomeInstanceValue
{
    if (someInstance == aSomeInstanceValue)
    {
        return;
    }
    SomeClass *oldValue = someInstance;
    someInstance = [aSomeInstanceValue retain];
    [oldValue release];
}

最後那段代碼好繞啊,寫成這樣不就好了嘛?

- (void)setSomeInstance:(SomeClass *)aSomeInstanceValue
{
    [someInstance release];
    someInstance = [aSomeInstanceValue retain];
}

上面的代碼的第一個release會在retain之前就把對象給銷燬了。

那寫個setter這麼麻煩,有木有簡單點的語法?有,如下:

- (void)setSomeInstance:(SomeClass *)aSomeInstanceValue
{
    [someInstance autorelease];
    someInstance = [aSomeInstanceValue retain];
}


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