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

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

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

и NSArray:

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

Ответы [ 2 ]

13 голосов
/ 19 марта 2010

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

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

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

3 голосов
/ 19 марта 2010

В Variadic-функциях в Objective-C нет способа определить, когда заканчивается список аргументов, кроме предоставления аргумента nil.

...