2011-08-15 87 views
3

在註冊回調以使用KVO進行更改時,這適用於編譯器警告。KVO - Cocoa回調'類'與'NSObject *'中不兼容的指針類型

這是一個意外(它的工作原理),還是有一些特殊的醬我要申請壓制警告?是否有每個班級的全球單身'+'NSObject?

[defaults addObserver:[MyClass class] forKeyPath:@"values.SomeValueThatITrack" options:options context:nil]; 

然後我也有MyClass.m:

+(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context; 
{ 
    usual blah 
} 

實際警告字符串: 「不兼容的指針類型發送 '類' 到類型爲 'NSObject的*'

的志願參數變化是全球喜好相關的變化,因此可以由類本身來處理,而不是任何單一實例。

+0

你爲什麼要這樣做,而不是創建一個單身人士?這不是通常的做法,所以你至少要採取經過較少測試的方法。 – Chuck

+0

單身人士有各種與他們相關的代碼,他們需要特殊的線程處理等。所以要做單身人士,我需要創建一個完全特殊的簡單類,它實際上只是一個簡單的單身人士的持有人,只能擁有全球意義。更簡單的方法是在適當的類中使用+方法。 –

+0

我不會考慮採用一種可能未經測試的代碼路徑,它違背成語和框架的設計,比複製和粘貼8行代碼更簡單,但我想這是您要維護的代碼庫。 – Chuck

回答

2

投射觀察者參數呃消除編譯器警告:

[defaults addObserver:(id)[MyClass class] forKeyPath:@"values.SomeValueThatITrack" options:options context:nil]; 

所以看起來類可以對選擇作出迴應,但不是NSObject的的子類。類方法可以工作,因爲類可以響應選擇器。

我很好奇是否將Class的一個實例註冊爲觀察者可以在所有情況下工作,或者如果KVO需要觀察者提供通常由NSObject提供的其他功能。

+0

類不是一個類,所以它不能是NSObject的一個子類,也沒有實例。它只是一個指示類對象指針的裸類型。儘管如此,繼承自NSObject的類也獲得了它的方法。 – Chuck

+0

雖然類是對象,但類不是類。這很有道理,雖然這是一個令人困惑的安排。更新了我寫的內容。 – paulmelnikow

+0

我對這個線程有點晚了,但在靜態類上調用observeValueForKeyPath是一個好主意?它不適合我。這個線程也是這樣說的。 http://stackoverflow.com/questions/9078595/how-does-addobserverforkeypath-work-on-a-static-class – shshnk