Я не думаю, что существует проблема с Вашим подходом, если Вы будете всегда использовать результат (так как Ваш набор результатов не является большим, это не использует много памяти. Между прочим, если Вы сделаете это и никогда не будете использовать результат, то он наложит потерю производительности). Так, да, это - корректный способ сделать это.
Обычно я создаю собственный класс для хранения всех предпочтений моего приложения. Этот класс может загружать изменяемые копии userDefaults один раз при запуске программы, а затем обрабатывать все инкрементные сохранения по пути:
MyPreferences.h
@interface MyPreferences
{
NSMutableDictionary allPrefs;
}
@property (readonly) NSMutableDictionary * allPrefs;
- (void)load;
- (void)save;
@end
MyPreferences.m
@implementation MyPreferences
@synthesize allPrefs;
- (id)init
{
if ((self = [super init]) == nil) { return nil; }
allPrefs = [[NSMutableDictionary alloc] initWithCapacity:0];
return self;
}
- (void)dealloc
{
[allPrefs release];
[super dealloc];
}
- (void)load
{
// load all mutable copies here
[allPrefs setObject:[[defaults objectForKey:@"foo"] mutableCopy]
forKey:@"foo"];
// ...
}
- (void)save
{
[defaults setObject:allPrefs forKey:@"app_preferences"];
}
@end
Я создаю экземпляр этого класса в моем делегате приложения, а затем вызовите [myPrefs load]
при запуске моего приложения. Любые настройки, измененные во время работы программы, можно изменить с помощью myPrefs
, а затем сохранить, вызвав [myPrefs save]
по желанию:
MyPreferences * myPrefs = [myApplication myPrefs];
[myPrefs setObject:bar forKeyPath:@"allPrefs.foo.bar"];
[myPrefs save];
В качестве дополнительного бонуса вы можете структурировать MyPreferences
классом, как вам нравится, привнося преимущества объектно-ориентированного программирования для всего набора настроек. Я показал здесь простой способ, просто используя изменяемый словарь,