сохранение состояния объекта в dealloc не работает - PullRequest
0 голосов
/ 14 апреля 2011

Я только что заметил, что когда я сохраняю состояние объекта (@public float с, преобразованное в NSString с) в моем методе dealloc, используя

+(void)savePreferences:(NSString*)key :(NSString*)value{
    NSMutableString* mutableString=[[NSMutableString alloc]initWithString:value];
    CFPreferencesSetAppValue((CFStringRef)key, mutableString, kCFPreferencesCurrentApplication);    // Set up the preference.
    CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);// Write out the preference data.
    [mutableString release];
}

, сохраняются неправильные значения !?Если я вместо этого сохраню значения непосредственно перед выпуском, правильные значения сохраняются.Обратите внимание, что я осторожен, чтобы позвонить [super dealloc]; на end .Почему это?

1 Ответ

2 голосов
/ 14 апреля 2011

Несколько проблем с этим кодом;

  • сохранение состояния в -dealloc слишком поздно. К тому времени, когда вызывается -dealloc, граф объектов находится в процессе разрушения.

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

  • это имя метода не очень хорошее. Попробуйте что-то вроде savePreferencesValue:forKey:. Однако тот факт, что его можно вызывать много раз, приведет к значительной неэффективности (в том смысле, что он будет записывать список предпочтений снова и снова).

  • изменяемая строковая копия входящего значения - пустая трата циклов и памяти; нет необходимости

  • если вам не нужны расширенные функции CFPreferences * (), вам следует просто придерживаться NSUserDefaults; это приведет к меньшему количеству кода и меньшей хрупкости.

...