這是一個關於Cocoa編程技巧的問題。
當你想調用你的類的一個屬性的方法時,你應該使用KVC來獲取接收者還是隻需要輸入你的屬性名稱?Key-Value編碼和方法調用
例,KVC:
[[self property] myMethod];
實例,簡單:
[property myMethod];
謝謝!
這是一個關於Cocoa編程技巧的問題。
當你想調用你的類的一個屬性的方法時,你應該使用KVC來獲取接收者還是隻需要輸入你的屬性名稱?Key-Value編碼和方法調用
例,KVC:
[[self property] myMethod];
實例,簡單:
[property myMethod];
謝謝!
實施例,KVC:
[[self property] myMethod];
即不KVC。 KVC的方式是:
[[self valueForKey:@"myProperty"] myMethod]
當你知道編譯時的屬性時沒有理由這麼做;你可以直接詢問財產價值或伊娃價值。使用KVO和(在Mac上)綁定已經實現,沒有太多理由直接使用KVC,因爲KVO和Bindings使用它。
實施例,簡單:
[property myMethod];
這並不訪問屬性;它訪問伊娃。
當您向該物業的持有者發送訪問者消息(您的示例中爲self
)時,您只能訪問該屬性。無論您使用[self property]
還是self.property
,因爲它們是相同的;其中一個是property
給self
的消息,帶有任何暗示的副作用。
這是關鍵的區別:點擊訪問者可能會導致副作用,而訪問伊娃直接永遠不會。
因此,最好的做法:使用你的所有實例方法屬性(因爲你可能要的訪問者副作用),除了在init
方法和dealloc
,其中副作用將是一件壞事。 (通常,不應該將消息發送到半初始化或半解除鎖定的對象。例外情況是,當您明確指出該方法是init/dealloc進程的一部分時,因此將其編寫爲可安全使用這種情況。)
我相信正式版本在技術上是正確的,因爲這將保證來自時髦的吸氣劑的任何副作用。 (要確保,使自定義的getter包括NSLog("in getter!")
,讓我們知道,如果它的工作原理。)
有關設置,你必須使用[self setProperty:foo];
爲property = foo
繞過二傳手,並可能導致內存泄漏。
如果感覺更自然,點符號(例如,self.property
和self.property = foo
)與[self property]
和[self setProperty:foo]
相同。
我不知道我在跟着你... 你說過要在實例方法中使用屬性,所以我應該這樣做:[[self property] method],除了init和dealloc? 您對accessor的副作用意味着什麼? – Bakaburg 2010-07-25 01:10:56
'self.property'和'[self property]'同樣有效(相當於)訪問屬性的方式:都向'self'發送一個訪問者消息。單獨說'property'根本不訪問屬性:它直接訪問實例變量。訪問器方法可能具有除了簡單訪問伊娃以外的副作用;最常見的是保留或複製新值的setter,但getter也可能帶有副作用,例如延遲獲取/計算值(例如' - (Answer *)answer {if(answer == nil){ answer = [self computeAnswer];} return answer;}')。 – 2010-07-25 03:16:25