2013-02-22 69 views
3

哪種方式更適合用於鍵值編碼?讓我們假設myController的類具有可變MYVARIABLE。有人可以寫出不好的意見,這是不好的,爲什麼。KVC使用哪種方法?

// Method in the MyController class. 
- (NSString*)myVariableKVC { 
    return NSStringFromSelector(@selector(myVariable)); 
} 

[myController addObserver:self 
       forKeyPath:[myController myVariableKVC] 
        options:NSKeyValueObservingOptionNew 
        context:nil]; 

2.

[myController addObserver:self 
       forKeyPath:@"myVariable" 
        options:NSKeyValueObservingOptionNew 
        context:nil]; 

從我的觀點第一部分的一點是越多越好。我們沒有硬編碼的字符串,當我們將使用重構 - >重命名...重命名時,它將被重命名。

回答

3

如果您有一個名爲-Wundeclared-selector(Xcode名稱:「Undeclared Selector」,Xcode構建設置:GCC_WARN_UNDECLARED_SELECTOR)啓用,如果您更改選擇器的名稱(第一種方法會給你一些來自編譯器的警告這在任何地方都沒有被聲明爲選擇器),正如你所指出的那樣,這會略微減少硬編碼/「魔術」字符串。我不會理會有它獨立的方法,雖然,我只是這樣做:

[myController addObserver:self 
       forKeyPath:NSStringFromSelector(@selector(myVariable)) 
        options:NSKeyValueObservingOptionNew 
        context:nil]; 

此警告在默認情況下,我看着Xcode項目模板,所以如果你想這個檢查,您需要手動打開項目的警告。

在沒有該警告的情況下,沒有區別,除了第一個方法引發另一個函數調用(並且在ObjC方法返回選擇器(如問題中所示)的情況下發送ObjC消息)。我覺得這個警告以前是默認開啓的,但事實上,我猜想。

+0

這實際上是不正確的。如果選擇器名稱中存在拼寫錯誤,編譯器將不會產生警告。它最終與使用硬編碼的魔術字符串沒有區別。 – Darren 2013-02-22 12:28:43

+0

哦,嘿,你是對的。我覺得它過去常常會給出「未知的選擇器」警告..​​....也許我很困惑。好吧。爲後人編輯。 – ipmcc 2013-02-22 12:32:31

+0

如果您有嚴格的編譯器警告(您應該),如果該選擇器不存在任何地方,您將會收到錯誤。 – 2013-02-22 12:37:08