2010-07-24 37 views
1

這是一個關於Cocoa編程技巧的問題。
當你想調用你的類的一個屬性的方法時,你應該使用KVC來獲取接收者還是隻需要輸入你的屬性名稱?Key-Value編碼和方法調用

例,KVC:

[[self property] myMethod]; 

實例,簡單:

[property myMethod]; 

謝謝!

回答

2

實施例,KVC:

[[self property] myMethod]; 

即不KVC。 KVC的方式是:

[[self valueForKey:@"myProperty"] myMethod] 

當你知道編譯時的屬性時沒有理由這麼做;你可以直接詢問財產價值或伊娃價值。使用KVO和(在Mac上)綁定已經實現,沒有太多理由直接使用KVC,因爲KVO和Bindings使用它。

實施例,簡單:

[property myMethod]; 

這並不訪問屬性;它訪問伊娃。

當您向該物業的持有者發送訪問者消息(您的示例中爲self)時,您只能訪問該屬性。無論您使用[self property]還是self.property,因爲它們是相同的;其中一個是propertyself的消息,帶有任何暗示的副作用。

這是關鍵的區別:點擊訪問者可能會導致副作用,而訪問伊娃直接永遠不會。

因此,最好的做法:使用你的所有實例方法屬性(因爲你可能的訪問者副作用),除了在init方法和dealloc,其中副作用將是一件壞事。 (通常,不應該將消息發送到半初始化或半解除鎖定的對象。例外情況是,當您明確指出該方法是init/dealloc進程的一部分時,因此將其編寫爲可安全使用這種情況。)

+0

我不知道我在跟着你... 你說過要在實例方法中使用屬性,所以我應該這樣做:[[self property] method],除了init和dealloc? 您對accessor的副作用意味着什麼? – Bakaburg 2010-07-25 01:10:56

+0

'self.property'和'[self property]'同樣有效(相當於)訪問屬性的方式:都向'self'發送一個訪問者消息。單獨說'property'根本不訪問屬性:它直接訪問實例變量。訪問器方法可能具有除了簡單訪問伊娃以外的副作用;最常見的是保留或複製新值的setter,但getter也可能帶有副作用,例如延遲獲取/計算值(例如' - (Answer *)answer {if(answer == nil){ answer = [self computeAnswer];} return answer;}')。 – 2010-07-25 03:16:25

0

我相信正式版本在技術上是正確的,因爲這將保證來自時髦的吸氣劑的任何副作用。 (要確保,使自定義的getter包括NSLog("in getter!"),讓我們知道,如果它的工作原理。)

有關設置,你必須使用[self setProperty:foo];property = foo繞過二傳手,並可能導致內存泄漏。

如果感覺更自然,點符號(例如,self.propertyself.property = foo)與[self property][self setProperty:foo]相同。