Почему делают списки аргументов в определенных методах Какао заканчиваются нолем?

Почему делают список аргументов в некоторых методах заканчивается nil? Я заметил это особенно в классах набора, например NSSet:

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

и NSArray:

NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", @"value3", nil];
6
задан jscs 25 June 2015 в 03:19
поделиться

2 ответа

Это связано с тем, как работают списки переменных аргументов ( va_list , в параметрах отображается как ... ). Когда код пытается извлечь все значения в списке, ему нужно знать, когда остановиться (потому что он не знает, сколько их). Мы обозначаем конец списка специальным значением, называемым «дозорным», которое обычно равно NULL . Таким образом, когда код обработки встречает nil в va_list , он знает, что достиг конца.Если вы опустите nil , вы получите странные ошибки, потому что код будет просто читать вниз по стеку, интерпретируя вещи как объекты, пока не найдет nil .

Это очень похоже на то, почему строки C должны завершаться NULL .

В качестве примечания: stringWithFormat: и аналогичные методы в стиле printf не нуждаются в дозоре, потому что он определяет, сколько параметров ему нужно, в зависимости от того, сколько % модификаторы находятся в строке формата. Поэтому, если вы зададите строку формата @ "hello,% @" , тогда он будет искать только один дополнительный аргумент, потому что есть только один модификатор%.

13
ответ дан 8 December 2019 в 14:42
поделиться

Функции с переменным числом аргументов в Objective-C не имеют другого способа определить, когда заканчивается ваш список аргументов, кроме предоставления аргумента nil .

3
ответ дан 8 December 2019 в 14:42
поделиться