2012-01-09 60 views
0

我今天發現了這個,只是想驗證我對發生了什麼事的理解。 「prefixName」是一個使用getter方法直接傳回值的只讀屬性,沒有iVar將結果存儲在PR_ViewController對象上。此外,如果該屬性不是隻讀添加一個setter仍然不會工作,因爲沒有iVar設置。沒有iVar和getter方法的屬性?

  • 創建:[甲基] prefixName

相比之下 「characterName」 適用於一個屬性通常的方式,加入了吸氣劑,一個設置器和一個IVAR。

  • 創建:[甲基] characterName
  • 創建:[甲基] setCharacterName
  • 創建:[IVAR] characterName

@interface PR_ViewController : UIViewController 
@property (nonatomic, readonly) NSString *prefixName; 
@property (nonatomic, retain) NSString *characterName; 

@implementation PR_ViewController 
@synthesize characterName; 

- (NSString *)prefixName { 
    return @"FRED"; 
} 
+0

不要重複您的問題。請關閉其中一個。 – Ilanchezhian 2012-01-09 13:04:33

+0

你正確地理解它。 – 2012-01-09 13:04:37

+0

[Property with no iVar and getter method?]可能重複?(http://stackoverflow.com/questions/8788773/property-with-no-ivar-and-getter-method) – rckoenes 2012-01-09 13:34:00

回答

7

您不需要綜合訪問器 - 您可以完全自己編寫它們,這就是您的示例中所做的。

此外,只讀屬性不必基於伊娃,但可以基於其他ivars或屬性進行計算。如果您使用綁定來顯示UI中從其他屬性派生的值(如果您喜歡該編碼風格的話),這會非常有用。

這裏是一個只讀屬性基於其它兩個屬性計算的簡單示例:

頭文件:

@property double width; 
@property double height; 

@property (readonly) double area; 

實現:

@synthesize width, height; 

- (double)area 
{ 
    return width*height; 
} 


+ (NSSet *)keyPathsForValuesAffectingArea 
{ 
    return [NSSet setWithObjects:@"width", @"height", nil]; 
} 

現在,width每當任一或height更改,area屬性也會更改,並且其更改會傳播到其偵聽器(比ks到keyPathsForValuesAffectingArea。)

您還可以在此doc中看到fullName示例。

+0

我知道你可以手動編寫getter和setter,但更多的問題是沒有iVar支持這個屬性。在上面的例子中,prefixName在對象上沒有一個iVar,characterName就是這樣。 – fuzzygoat 2012-01-09 13:39:44

+0

我想我們彼此瞭解,但我認爲它是伊娃只是存儲或計算房產價值的衆多方式之一。例如,它也可以是一組數字的總和。 – Monolo 2012-01-09 13:43:19

+0

謝謝,我想我現在可以理解它。在手動添加iVar或使用@synthesis生成iVar的情況下,手動添加訪問器(getter&setter)。然而,getter返回沒有價值,所以你必須在方法中計算一個值,就像明智地使用setter一樣,沒有什麼可設置的,所以setter有點多餘(除非你想要有點複雜和設置別的東西/其他一些iVar – fuzzygoat 2012-01-09 13:49:49

相關問題