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