Что делает эта часть цели-c? - PullRequest
1 голос
/ 22 сентября 2010

Я не совсем уверен, что это делает.Является ли dateFormatter настраиваемым только в первый раз?

static NSDateFormatter *dateFormatter = nil;

if (dateFormatter == nil) {
    dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
} 

Обычно я прочитал бы это, чтобы означать, установить что-то в nil, а затем проверить, является ли оно nil, но если я NSLog в условном выражении, он вызывается только один раз?

Дополнительные баллы, если вы можете объяснить статику более подробно, я знаю, что она создает глобальную переменную (?), Но это все.

Ответы [ 4 ]

7 голосов
/ 22 сентября 2010

Нет, static не сделает dateFormatter частью класса. Это может выглядеть так, но static не является функцией Objective-C и ничего не знает о классах.

static - это стандартная функция языка Си. Помните, что Objective-C является просто расширением C. Если в методе используется static, он создаст глобальную переменную, видимую только внутри этого метода.

Это означает, что эта переменная расположена не в стеке, а в сегменте данных. Переменные, локально определенные в методах (нестатические), помещаются в стек вместе с адресом кода, куда возвращаться после завершения вызова метода - поэтому, когда выполнение покидает метод, локальные переменные метода исчезают. В этом методе dateFormatter всегда представляет одно и то же место в памяти.

Смысл сделать dateFormatter статичным в этом случае - повысить производительность - вы всегда форматируете даты с одним и тем же форматером, поэтому нет смысла каждый раз воссоздавать этот форматер, поэтому он создается и сохраняется в глобальная переменная только один раз.

1 голос
/ 22 сентября 2010

Как сказал Михал, «статический» является частью стандартного С. Он имеет два одинаково важных эффекта:

  1. «статический» делает значение переменной постоянным даже после того, как переменная вышла изscope.
  2. «static» делает переменную видимой только в пределах своей единицы перевода (где «единица перевода» - это любой исходный файл без заголовка, который был предварительно обработан).Если у вас есть две глобальные переменные или константы с одинаковыми именами в разных единицах перевода, один из способов избежать конфликта имен во время компоновки - сделать обе переменные статичными.

См. Превосходную Википедиюстатья о "статической переменной" .

0 голосов
/ 22 сентября 2010

DateFormatter устанавливается только в первый раз?

Нет, вы можете настроить свой формат и использовать, а затем использовать метод stringFromDate:(NSDate*) aDate для преобразования даты в строку с вашим форматом.

0 голосов
/ 22 сентября 2010

Статический означает, что это глобальная переменная, однако в этом случае к ней можно получить доступ только тогда, когда в функции статический блок произойдет один раз.Остальное будет происходить каждый раз, но поскольку есть проверка, уже инициализирована ли она, блок в «если» также произойдет один раз.Таким образом, единственный фрагмент кода, который будет выполняться более одного раза, - это проверка в условии «если».

...