Question

Pourquoi certaines méthodes ne liste d'arguments se terminent par nil? Je l'ai remarqué en particulier dans les classes de collection, par exemple NSSet:

mySet = [NSSet setWithObjects:someData, aValue, aString, nil];

et NSArray:

NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", @"value3", nil];
Était-ce utile?

La solution

Il a à voir avec la façon dont les listes d'arguments variables travail (va_list, considéré comme ... dans les paramètres). Lorsque le code tente d'extraire toutes les valeurs dans la liste, il doit savoir quand il faut arrêter (car il ne sait pas combien il y a). On note la fin de la liste avec une valeur spéciale appelée « sentinelle », qui est habituellement NULL. De cette façon, lorsque le code de traitement est à travers un nil dans le va_list, il sait qu'il a atteint la fin. Si vous laissez le nil, vous obtenez des erreurs étranges, parce que le code va juste continuer à lire en bas de la pile, l'interprétation des choses comme des objets, jusqu'à ce qu'il trouve un nil.

Ceci est très similaire à la raison pour laquelle les chaînes C doivent être mis fin à NULL.

Comme une note de côté, la stringWithFormat: et des méthodes similaires de style printf ne pas besoin d'une sentinelle, car il figure combien de paramètres dont il a besoin en fonction du nombre de modificateurs % sont dans la chaîne de format. Donc, si vous donnez une chaîne de format de @"hello, %@", alors il ne faut rechercher un argument supplémentaire, parce qu'il n'y a qu'un seul modificateur%.

Autres conseils

Fonctions VARIADIC en Objective-C ne sont pas une façon de déterminer la fin de votre liste d'arguments, autre que de fournir un argument nil.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top