assign, copy, retain - 仔细看看怎么回事

时间:2022-04-03 13:09:15

用@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];
}