2010-03-26 48 views
2

對不起,如果問題不正確,我在Objective-C中很新。
我明白爲什麼這個代碼拋出警告:「警告:傳遞‘initWithObjectsAndKeys:’的參數1,使指針從整數無」在具有可變參數的方法中投射警告

NSDictionary *dictNames = 
[[NSDictionary alloc] initWithObjectsAndKeys: 
    3, @"", 
    4, @"", 
    5, @"",nil]; 

鍵和一個NSDictionary中的值必須是NSObject的,而不是基本類型,就像整數3,4和5一樣。(必要時糾正我)。
但我不明白爲什麼這個警告消失了第一個鍵的唯一「正確鍵入」。

NSDictionary *dictNames = 
    [[NSDictionary alloc] initWithObjectsAndKeys: 
    [NSNumber numberWithInteger:3], @"", 
    4, @"", 
    5, @"",nil]; 

這是因爲NSDictionary假定其他Keys的類型?這種初始化方式是否正確?

回答

7

你所提到的方法的原型是

-(id)initWithObjectsAndKeys:(id)firstObject, ...; 

因此,第一參數必須是ObjC對象。但其餘的都是通過可變參數傳遞的。在C中,任何原語都可以作爲可變參數傳遞(想想printf)。因此編譯器不會發出任何警告。

儘管編譯器不能剔除可變參數的類型,但並不意味着將非id傳入該方法是有效的。

+0

我看到...實際上,當我必須通過key來獲取對象時,我必須使用objectForKey:(id)aKey來完成,然後Objects和Keys必須是(id)。 感謝您的回答:-) – rubdottocom 2010-03-27 12:45:46

+0

第一個arg是一個Obj C對象嗎?如果不是,聲明的語法應該是什麼? – 2011-09-09 06:20:07

+0

@Saptarshi:不,例如' - (int)foo:(int)firstInt,...' – kennytm 2011-09-09 08:38:55

相關問題