Frage

Warum in manchen Methoden Argument Liste tun enden mit nil? Ich habe dies vor allem in den Sammelklassen bemerkt, zum Beispiel NSSet:

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

und NSArray:

NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", @"value3", nil];
War es hilfreich?

Lösung

Es hat mit, wie variable Argumentlisten zu tun (va_list, wie ... in den Parametern zu sehen). Wenn der Code versucht, alle Werte in der Liste zu extrahieren, muss er wissen, wann man aufhören muss (weil er nicht weiß, wie viele es sind). Wir bezeichnen das Ende der Liste mit einem speziellen Wert eines „Sentinel“, die in der Regel NULL ist. Auf diese Weise, wenn die Verarbeitung von Code über eine nil im va_list kommt, weiß er, dass er das Ende erreicht ist. Wenn Sie die nil auslassen, werden Sie seltsame Fehlermeldungen erhalten, da der Code nur auf das Lesen Sie die Stapel halten, Dinge als Objekte zu interpretieren, bis er eine nil findet.

Dies ist sehr ähnlich, warum C-Strings haben NULL-terminiert sein.

Als Randbemerkung, die stringWithFormat: und ähnliche printf-Stil Methoden benötigen keine Sentinel, weil es herausfindet, wie viele Parameter es braucht auf, wie viele % Modifikatoren sind im Format-String. Wenn Sie also ein Format-String von @"hello, %@" geben, dann wird es nur für aussieht ein zusätzliches Argument, weil es nur einen% Modifikator ist.

Andere Tipps

Variadische Funktionen in Objective-C haben keine Möglichkeit festzustellen, wenn Ihr Argument Liste Ende, andere als ein nil Argument bereitgestellt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top