Зачем вам проверять статическую переменную на nil, если она была инициализирована на nil в предыдущей строке? - PullRequest
8 голосов
/ 08 января 2012

Ниже приведен пример кода из учебника Apple по основным данным для iOS , и я подумал, что странно, что условные операторы проверяют, равен ли объект нулю. Разве объект не всегда будет иметь значение nil, если строка перед условным значением устанавливает для объекта значение nil?

// A date formatter for the time stamp
static NSDateFormatter *dateFormatter = nil;
if (dateFormatter == nil) {
    dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
}

Ответы [ 3 ]

19 голосов
/ 08 января 2012

Из-за static. Эта переменная не устанавливается на nil всякий раз, когда выполнение проходит через этот оператор, она устанавливается только при запуске программы.

Это особенность статических переменных продолжительности хранения. Они устанавливаются на их начальное значение при запуске и сохраняют любое значение, которое вы установили после этого. Например, следующий код:

void plugh(void) {
    static int xyzzy = 0;
    printf (" %d", xyzzy); // or Obj-C equivalent.
    xyzzy++;
}

не будет выводить длинную строку нулей, если вы называете это скучным временем. Будет выведено:

0 1 2 3 4 ...

В случае кода Apple это означает, что форматер даты будет создан по требованию и (если вы не установите его обратно на nil где-то еще) только один раз. Иногда это может быть важно для производительности, если создание объекта - нетривиальная вещь, но даже если нет, то нет смысла постоянно воссоздавать что-то, что вы можете просто использовать повторно.

5 голосов
/ 08 января 2012

Я предполагаю, что этот код взят из тела функции.Вы должны отметить, что переменная static.Это означает, что да, при первом вызове этой функции она будет установлена ​​на nil.Однако в следующий раз, когда функция вызывается, она сохраняет свое значение из предыдущего вызова.

Таким образом, результатом этого является отложенная инициализация .Новый NSDateFormatter инициализируется только при первом вызове этой функции.

static фактически делает ее глобальной переменной, инициализированной этим значением, но видимой только для функции, в которой она объявлена.

1 голос
/ 08 января 2012

«Статический» означает, что он вычисляется только один раз при инициализации этого класса и при первом прогоне.Последующие прогоны пропустят его и перейдут к следующей строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...