Это плохая форма для синхронизации NSUserDefaults в - (void) dealloc? - PullRequest
7 голосов
/ 14 ноября 2010

Я загружаю из NSUserDefaults в методе init моего объекта.Могу ли я сохранить в NSUserDefaults в методе dealloc моего объекта?

Что-то вроде:

-(void)dealloc {
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setObject:self.filenamesArray forKey:self.defaultsKey];
    [userDefaults synchronize];
    self.filenamesArray = nil;
    self.defaultsKey = nil;
    [super dealloc];
}

хорошо, плохо, хорошо?если это не хорошо, где было бы лучше.

Редактировать:

Спасибо за подробные ответы.Все эти вещи имеют смысл.Еще одна причина, по которой я обнаружил, что это плохое место для сохранения пользовательских настроек по умолчанию, заключается в том, что dealloc вызывается только тогда, когда объект удачно удаляется.Если мое приложение убито, этот код никогда не запускается.Аналогично, если приложение отодвигается в фоновый режим (iOS 4), оно не запускается.Я также удалил явный вызов [userDefaults synchronize].Я немного нервничаю, но я доверяю яблоку на этом.:)

Ответы [ 2 ]

7 голосов
/ 14 ноября 2010

Это плохо, потому что к моменту вызова -dealloc другие объекты перестали интересоваться им. Это может иметь много разных последствий.

Лучшее место для установки пользовательских настроек по умолчанию - это момент изменения настроек. Таким образом, оно сохраняется сразу же, и приложение можно убить, не беспокоясь о том, что параметр не будет сохранен, потому что части вашего графа объектов уже могли исчезнуть.

0 голосов
/ 14 ноября 2010

Синхронизация пользовательских настроек по умолчанию в -dealloc ничем не отличается от других.Это потому, что, как ни странно, -dealloc никоим образом не волшебен и, в отличие от, скажем, деструкторов C ++, -dealloc на самом деле является типичным методом.Вы могли бы немного больше беспокоиться о передаче self.filenamesArray в userDefualts, потому что это на самом деле то, что может удерживаться после фактического освобождения, но я верю, что пользовательские значения по умолчанию сохранит его.

Относительно того, когда вам нужно [userDefaults synchronize];, люди меняются, и я лично не согласен с @Joshua - я никогда не синхронизирую явно, а просто позволяю NSUserDefaults позаботиться об этом.Если я не очень ошибаюсь, он запускается автоматически при закрытии приложения, а также периодически в противном случае.Поскольку он знает, когда он был обновлен, и ему нужно записать весь plist-файл сразу, я думаю, что я бы предпочел, чтобы алгоритмы Apple обрабатывали время написания значений по умолчанию, поскольку это занимает нетривиальное время (потому что этопишет в файловую систему).

(обратите внимание, что ни один из последних абзацев не применим, если у вас есть особые обстоятельства, связанные с настройками по умолчанию вашего пользователя, например, другое приложение, читающее / записывающее их)

...