Использование статического ключевого слова в target-c при определении кэшированной переменной - PullRequest
42 голосов
/ 17 февраля 2009

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

    /*
 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?

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

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

Ответы [ 3 ]

62 голосов
/ 17 февраля 2009

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

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

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

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

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

16 голосов
/ 17 февраля 2009

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

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

1 голос
/ 07 января 2014

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

+ (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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...