Приведение предупреждений в методы с переменными аргументами - PullRequest
2 голосов
/ 26 марта 2010

Извините, если вопрос не правильный, я очень новичок в Objective-C.
Я понимаю, почему этот код выдает предупреждение: "предупреждение: передача аргумента 1 в initWithObjectsAndKeys: делает указатель из целого числа без"

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 предполагает тип других ключей? Верен ли этот способ инициализации?

1 Ответ

7 голосов
/ 26 марта 2010

Прототип упомянутого вами метода -

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

Таким образом, первый параметр должен быть объектом ObjC. Но остальные проходят мимо вараггов. В C любые примитивы могут быть переданы как аргументы vararg (например, printf). Следовательно, компилятор не будет выдавать никаких предупреждений.

Хотя компилятор не способен проверять типы аргументов vararg, это не означает, что передача не-1007 * в метод является допустимой.

...