Es hat mit, wie variable Argumentlisten zu tun (va_list
, wie ...
in den Parametern gesehen). Wenn der Code versucht, alle Werte in der Liste zu extrahieren, muss er wissen, wann er anhalten muss (weil er nicht weiß, wie viele es sind). Wir bezeichnen das Ende der Liste mit einem speziellen Wert namens "Sentinel", der normalerweise NULL
ist. Auf diese Weise weiß der Verarbeitungscode nil
in va_list
, dass er das Ende erreicht hat. Wenn Sie die nil
weglassen, werden Sie merkwürdige Fehler bekommen, weil der Code den Stapel weiter liest und Dinge als Objekte interpretiert, bis er nil
findet.
Dies ist sehr ähnlich, warum C-Strings NULL
-terminiert sein müssen.
Als Randbemerkung, die stringWithFormat:
und ähnliche printf
-Stil Methoden benötigen keine Sentinel, weil es, wie viele Parameter herausfindet es je nach Bedarf, wie viele %
Modifikatoren im Formatstring sind. Wenn Sie also eine Formatzeichenfolge von @"hello, %@"
angeben, wird nur nach einem zusätzlichen Argument gesucht, da nur ein% -Modifikator vorhanden ist.
+1, aber ich denke immer noch eine Ascii-Art BSG Cylon wäre viel cooler als NULL für Sentinels – slf