2010-03-19 9 views

Antwort

13

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.

+6

+1, aber ich denke immer noch eine Ascii-Art BSG Cylon wäre viel cooler als NULL für Sentinels – slf

3

Variadische Funktionen in Objective-C haben keine Möglichkeit festzustellen, wann die Argumentliste endet, außer dass ein Argument nil bereitgestellt wird.

+1

Oder eine Formatzeichenfolge. (Wie in C.) –

+1

Oder eine explizite Argumentanzahl. –

Verwandte Themen