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%.
+1, mais je pense toujours qu'un cylon BSG ascii-art serait bien plus cool que NULL pour les sentinelles – slf