2010-03-22 102 views
1
NSString *statusValue; 
NSString *currentValue; 

@property(retain, nonatomic) NSString *statusValue; 
@property(retain, nonatomic) NSString *currentValue; 

@synthesize statusValue; 
@sythnesize currentValue; 

鑑於上述情況,如果我一個變量設置爲另一個我應該做的事...@property,setter和getter問題?

[self setStatusValue: currentValue]; 

,或者我應該再次使用性能和使用...

[self setStatusValue: [self currentValue]]; 

我想後者(儘管可能是矯枉過正)確實告訴讀者我們正在使用對象實例變量之一而不是一些局部變量。

只是好奇,真的,我是用一個底部去,只是想檢查之前有人看了我的代碼,並在「什麼是地獄」 :)

加里

+0

後者'[self currentValue]'不必引用實例變量。你真正知道的是它發送一條消息。該方法可能是屬性的getter('@ property'或其他),或者它可能不是。如果是這樣,該屬性可能由實例變量支持,或者可能不支持。它可能是某種財產,以它的名字命名,這纔是真正重要的;如果一個實例變量是你關心的訪問,你可以直接訪問它。 'c'世界裏的 – 2010-03-24 14:08:50

回答

3

兩者都很好。你使用哪一種可能取決於你所希望的副作用。例如,通過使用[self currentValue],您可以關閉willAccessValueForKey:didAccessValueForKey: KVO通知,但前提是隻有當某人實際觀察該屬性時,並且僅當該子類爲NSManagedObject子類時。通常沒有任何主要的副作用。我個人可能會使用後面的例子,這樣我就不必擔心如果我決定改變它的話,在30個地方更改iVar的名稱(當然,重構 - >重命名工具將是在這種情況下使用的權利,但仍然)。

0

這工作,更富有表現力的IMO:

self.statusValue = currentValue;

+0

,是的;在obj-c世界中,沒有。 – KevinDTimm 2010-03-22 19:46:27

+1

從Objective-C 2.0開始'self.statusValue = currentValue;'是'[self setStatusValue:currentValue];'的語法糖,'也稱爲「點語法」。 – 2010-03-22 20:22:12

2

我在沒有令人信服的理由的情況下使用後者。這樣它就可以與重寫的訪問器,更改的實現等一起工作,無需任何更改。例如,也許我決定將statusValue存儲爲一個字符串,而將狀態對象與statusValue一起存儲。如果我手動訪問整個地方的伊娃,我必須改變他們所有的人。如果我正在瀏覽該類的公共接口,則只需更改一個訪問器方法。