Это связано с тем, как работают списки аргументов переменных (va_list
, в параметрах ...
). Когда код пытается извлечь все значения из списка, ему нужно знать, когда остановиться (потому что он не знает, сколько их существует). Мы обозначаем конец списка специальным значением, называемым «страж», которое обычно составляет NULL
. Таким образом, когда код обработки встречает nil
в va_list
, он знает, что он достиг конца. Если вы пропустите nil
, вы получите странные ошибки, потому что код будет просто читать стек, интерпретируя вещи как объекты, пока не найдет nil
.
Это очень похоже на то, почему строки C должны быть NULL
-определены.
В качестве примечания, методы stringWithFormat:
и аналогичные методы printf
не нуждаются в страже, поскольку он вычисляет, сколько ему нужно параметров, исходя из количества модификаторов %
в строке формата. Поэтому, если вы дадите строку форматирования @"hello, %@"
, тогда он будет искать только один дополнительный аргумент, потому что есть только один модификатор%.