2010-03-19 12 views

Répondre

13

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 essaie d'extraire toutes les valeurs de la liste, il doit savoir quand s'arrêter (car il ne sait pas combien il y en a). Nous notons la fin de la liste avec une valeur spéciale appelée "sentinel", qui est généralement NULL. De cette façon, lorsque le code de traitement rencontre un nil dans le va_list, il sait qu'il a atteint la fin. Si vous omettez le nil, vous obtiendrez des erreurs étranges, car le code continuera à lire la pile, en interprétant les objets 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 NULL -terminated.

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

+6

+1, mais je pense toujours qu'un cylon BSG ascii-art serait bien plus cool que NULL pour les sentinelles – slf

3

Les fonctions variables dans Objective-C n'ont pas de moyen de déterminer quand votre liste d'arguments se termine, autre que de fournir un argument nil.

+1

Ou une chaîne de format. (Identique à C.) –

+1

Ou un nombre d'arguments explicite. –