2010-03-26 47 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

相关问题