Обычно я создаю пользовательский класс для хранения всех моих настроек приложения. Этот класс может загружать изменяемые копии из 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
класс так, как вам нравится, в результате чего преимущества OO для всего набора предпочтений. Я показал простой способ, просто используя изменяемый словарь, но вы можете сделать каждое предпочтение в свойстве и выполнять предварительную/пост-обработку для более сложных объектов, например, NSColor
.