iOS базовое управление памятью - PullRequest
5 голосов
/ 03 августа 2011

Я читаю книгу "Ранчо большого ботаника" по программированию на iOS, и у меня возник вопрос о программе Hypnotime, которую они создали в главе 7.

В какой-то момент они реализуют следующий метод:

- (void)showCurrentTime:(id)sender
{
    NSDate *now = [NSDate date];

    static NSDateFormatter *formatter = nil;

    if (!formatter) {
        formatter = [[NSDateFormatter alloc] init];
        [formatter setTimeStyle:NSDateFormatterShortStyle];
    }

    [timeLabel setText:[formatter stringFromDate:now]];

}

Мой вопрос о NSDateFormatter *formatter. Форматтер создается с alloc и init. Я всегда знал, что что-то с alloc нужно где-то выпустить, верно? Когда formatter передается timeLabel, разве timeLabel не отправляет retain ему? И не могу (не должен?) Я впоследствии выпустить formatter?

Я просмотрел код на следующих двух страницах и нигде не могу найти никакого сообщения о выпуске, кроме release, отправляемого на timeLabel в dealloc.

Я что-то здесь смешиваю? Есть ли причина, по которой formatter не должен быть выпущен мной? Я хочу быть хорошим гражданином памяти. Любая помощь приветствуется:)

Ответы [ 3 ]

2 голосов
/ 03 августа 2011

Из-за ключевого слова static formatter будет оставаться доступным до следующего вызова метода в качестве глобальной переменной - ну, не будучи global

См. Статью в Википедии о статических

1 голос
/ 03 августа 2011

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

//static (even in a method) will allow formatter to live during entire app lifecycle
static NSDateFormatter *formatter = nil;

//Check if formatter has been set (this is not thread safe)
if (!formatter) {
    //Set it once and forget it, it wont be a leak, and it wont ever be released
    formatter = [[NSDateFormatter alloc] init];
    [formatter setTimeStyle:NSDateFormatterShortStyle];
}
1 голос
/ 03 августа 2011

setText просто получает строку (не сам форматтер), поэтому форматер не сохраняется. Я держу пари, что они используют форматер где-то еще в контроллере, и поэтому он освобождается в dealloc

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