2010-03-26 6 views
2

Désolé, si la question n'est pas correcte, je suis très nouveau en Objective-C.
Je comprends pourquoi ce code jeter l'avertissement: « avertissement: passage d 'arguments 1 « initWithObjectsAndKeys: » un entier en pointeur sans »Mises en garde dans les méthodes avec des arguments variables

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

clés et des valeurs d'un NSDictionary doit être NSObject et non types fondamentaux , comme les entiers 3, 4 et 5. (Corrigez-moi si nécessaire).
Mais je ne comprends pas pourquoi cet avertissement disparaît avec la seule "saisie correcte" de la première clé. C'est parce que NSDictionary prend le type des autres clés? Est-ce correct ce mode d'initialisation?

Répondre

7

Le prototype de la méthode que vous avez mentionné est

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

Ainsi, le premier paramètre doit être un objet ObjC. Mais le reste est passé par varargs. En C, toutes les primitives peuvent être passées en argument vararg (pensez printf). Par conséquent, le compilateur n'émettra aucun avertissement.

Alors que le compilateur est incapable de saisir les types des arguments vararg, cela ne signifie pas que le passage non-id dans la méthode est valide.

+0

Je vois ... en fait quand je dois obtenir un objet par clé je dois le faire avec une objectForKey: (id) aKey puis les objets et ensuite les clés doivent être (id). Merci pour la réponse :-) – rubdottocom

+0

Est-ce une exigence pour le 1er argument d'être un objet Obj C? Si non, quelle devrait être la syntaxe de la déclaration? –

+0

@Saptarshi: Non, par ex. '- (int) foo: (int) firstInt, ...' – kennytm

Questions connexes