Использование ключевого слова static в objective-c при определении кешированной переменной

Я смотрю следующий исходный код примера Apple:

    /*
 Cache the formatter. Normally you would use one of the date formatter styles (such as NSDateFormatterShortStyle), but here we want a specific format that excludes seconds.
 */
static NSDateFormatter *dateFormatter = nil;
if (dateFormatter == nil) {
    dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"h:mm a"];
}

Попытка выяснить:

  • Зачем использовать ключевое слово static?

  • Как это приравнивается к кешированной переменной, если вы установите ее на ноль при каждом вызове метода.

Код из примера 4 в демонстрации Tableview Suite

Ответ 1

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

Оператор инициализатора выполняется только один раз.

Этот код инициализирует dateFormatter для nil при первом использовании функции. При каждом последующем вызове функции выполняется проверка против значения dateFormatter. Если он не установлен (это будет только правда в первый раз), создается новый dateFormatter. Если он установлен, вместо него будет использоваться статическая переменная dateFormatter.

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

Просто подсказка: Иногда это может быть образовательным, чтобы разместить точку останова в коде и посмотреть, что происходит. По мере увеличения сложности ваших программ это станет бесценным навыком.

Ответ 2

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

Используйте эту великую силу с большой ответственностью: вы рискуете использовать целую кучу памяти, поскольку это объекты, которые никогда не исчезают. Он редко подходит, за исключением случаев, подобных этому с NSDateFormatter.

Ответ 3

В качестве справочных целей я использую статический для форматирования даты для использования в контроллере табличного представления.

+ (NSDateFormatter *) relativeDateFormatter
{
     static NSDateFormatter *dateFormatter;
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
         //NSLog(@"Created");
         dateFormatter = [[NSDateFormatter alloc] init];
         [dateFormatter setTimeStyle:NSDateFormatterNoStyle];
         [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
         NSLocale *locale = [NSLocale currentLocale];
         [dateFormatter setLocale:locale];
         [dateFormatter setDoesRelativeDateFormatting:YES];
     });
     return dateFormatter;
}