переменная должна быть освобождена или нет? iphone-SDK - PullRequest
0 голосов
/ 20 марта 2010

У меня есть следующий фрагмент кода из книги.

Есть эта функция loadPrefs, где NSString * userTimeZone высвобождается до конца функции.

Почему?Строка не была создана с помощью alloc, и я предполагаю, что функция stringForKey возвращает автоматически освобожденную строку NSString.Это ошибка или я что-то упустил?Это ошибка в книге?(Я впервые в target-C)

В документации для stringForKey упоминается только то, что:

Особые замечания

* 1015возвращаемая строка является неизменной, даже если значение, которое вы изначально установили, было изменяемой строкой.

Код:

- (void) loadPrefs {
    timeZoneName = DefaultTimeZonePref;

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *userTimeZone = [defaults stringForKey: TimeZonePrefKey];
    if (userTimeZone != NULL)
        timeZoneName = userTimeZone;
    [userTimeZone release];
    show24Hour = [defaults boolForKey:TwentyFourHourPrefKey];
}

Спасибо !!!!

1 Ответ

0 голосов
/ 20 марта 2010

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

Вот лучшая попытка:

- (void) loadPrefs {
    [timeZoneName release]; // In case there was a previous value

    timeZoneName = DefaultTimeZonePref; // ASSUMPTION: DefaultTimeZonePref is a constant
    // And thus doesn't need retain/release.

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *userTimeZone = [defaults stringForKey: TimeZonePrefKey];
    if (userTimeZone != NULL) {
        timeZoneName = [userTimeZone retain];
    }

    show24Hour = [defaults boolForKey:TwentyFourHourPrefKey];
}

И не забудьте выпустить timeZoneName в dealloc.

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