2009-07-22 43 views
1

最近我的代碼中出現了一些意外的編譯錯誤,我感到非常困惑。我做了一些故障排除,我想出了這個位的測試代碼:performSelector的結果:與標準點符號調用不同?

1 float performSelectorResult, messageResult; 
2 SEL selector = @selector(smallContentCellMargin); 
3 
4 NSLog (@"selector %s result %f", selector, [defaults performSelector:selector]); 
5 NSLog (@"message result is %f", defaults.smallContentCellMargin); 
6 
7 performSelectorResult = [defaults performSelector:selector]; 
8 messageResult = defaults.smallContentCellMargin; 

如果我運行的代碼,是,我得到第7行編譯錯誤:「不兼容的類型分配」。但是,如果我註釋掉第7行代碼的構建和運行,在NSLog的結果是:

2009-07-21 18:31:44.823 ICE[24347:20b] selector smallContentCellMargin result 0.000000 
2009-07-21 18:31:44.830 ICE[24347:20b] message result is 7.000000 

我已經使用非常相似的代碼來檢索一個UIFont,但從來沒有一個浮點數。有什麼我不知道的,或者這是Objective-C中的錯誤嗎?我很困惑。

回答

3

首先,這是您在使用NSLog進行日誌記錄時將選擇器視爲字符串。不要這麼做 - SEL不是一個字符串。使用%@格式和NSStringFromSelector(aSelector)。

對於手頭的問題,-performSelector:被定義爲與具有對象返回類型的任何選擇器一起使用。由於ABI的原因,您可以避免使用這種方式來獲取最大爲指針大小的int返回類型(取決於運行時實現細節),但您一般無法擺脫浮點返回值,正如您已經注意到的那樣。

對於非對象返回值,應該使用NSInvocation或-valueForKey :.在後一種情況下,你會得到一個浮動框爲NSNumber。

+0

我嘗試了-valueForKey的快速測試:'float quickTest = [defaults valueForKey:@「smallContentCellMargin」];'當我嘗試編譯代碼時,出現「初始化中的不兼容類型」錯誤。我在文檔中查找了-valueForKey,並且它說它返回類型(id) - 我做錯了什麼,或者在這種情況下是否與-performSelector相同? – JoBu1324 2009-07-22 03:04:13

相關問題