Warum Argumentlisten in bestimmten Kakao-Methoden mit einer Null enden?
-
21-09-2019 - |
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];
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.