Почему делают список аргументов в некоторых методах заканчивается nil
? Я заметил это особенно в классах набора, например NSSet
:
mySet = [NSSet setWithObjects:someData, aValue, aString, nil];
и NSArray
:
NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", @"value3", nil];
Это связано с тем, как работают списки переменных аргументов ( va_list
, в параметрах отображается как ...
). Когда код пытается извлечь все значения в списке, ему нужно знать, когда остановиться (потому что он не знает, сколько их). Мы обозначаем конец списка специальным значением, называемым «дозорным», которое обычно равно NULL
. Таким образом, когда код обработки встречает nil
в va_list
, он знает, что достиг конца.Если вы опустите nil
, вы получите странные ошибки, потому что код будет просто читать вниз по стеку, интерпретируя вещи как объекты, пока не найдет nil
.
Это очень похоже на то, почему строки C должны завершаться NULL
.
В качестве примечания: stringWithFormat:
и аналогичные методы в стиле printf
не нуждаются в дозоре, потому что он определяет, сколько параметров ему нужно, в зависимости от того, сколько %
модификаторы находятся в строке формата. Поэтому, если вы зададите строку формата @ "hello,% @"
, тогда он будет искать только один дополнительный аргумент, потому что есть только один модификатор%.
Функции с переменным числом аргументов в Objective-C не имеют другого способа определить, когда заканчивается ваш список аргументов, кроме предоставления аргумента nil
.