2012-09-09 57 views
1

我從Big Nerd Ranch iOS編程書中獲取了這段代碼。在代碼中,它們分配兩個實例變量,即coordinatetitle。爲什麼直接分配coordinate,並且通過調用setter來設置title爲什麼二傳手被稱爲一個屬性而不是另一個?

頭文件

@interface BNRMapPoint : NSObject<MKAnnotation> 

    -(id)initWithCoordinate:(CLLocationCoordinate2D)c title:(NSString *)t; 

    @property(nonatomic, readonly) CLLocationCoordinate2D coordinate; 
    @property(nonatomic, copy) NSString *title; 

@end 

實現文件

-(id)initWithCoordinate:(CLLocationCoordinate2D)c title:(NSString *)t 
{ 
    self = [super init]; 
    if(self){ 
     coordinate = c; 
     [self setTitle:t]; 
    } 
    return self; 
} 

回答

1

兩個原因,其中最重要的是,沒有爲coordinate屬性沒有setter。它被聲明爲只讀,所以只有一個getter方法生成。

第二是CLLocationCoordinate2D是一個結構,而不是一個對象。有內存管理操作(在這種情況下複製)必須爲title對象採取;最簡單的方法是使用已經存在的setter方法。編譯器負責移動像CLLocationCoordinate2D這樣的POD類型的數據。

如果第二個是唯一的原因,不過,這將是一個錯誤的決定 - 這是不好的風格來使用的setter一個財產,不爲別的。

+2

它可以是隻讀,或者它可以被重新聲明爲在延伸(這似乎不是)讀寫。但是,是的......死了。這只是不一致和糟糕的編碼風格。刪除了我的答案;你的更全面。 – bbum

+0

他可以在私人界面中進行讀寫,並在公共界面中只讀。只有當我真正將事情完全讀取時,如果沒有直接備份屬性的變量,而是發出其他隱藏的內部狀態的方式,或者返回值是多個狀態之和值等等。這裏有一個實際的變量,他設置了......所以爲什麼不讓它自己讀寫並通過setter?更一致的是,因爲他似乎想要做的就是防止人們通過初始化工具來搞亂_coordinate_。 – Metabble

0

There is a school of thought,說你應該複製NSString的。他們正在調用字符串的setter來獲取該副本。但是,沒有必要複製(甚至保留)座標,就像Josh指出的那樣。

+0

這是不一致的確切來源。 – bbum

相關問題