6

我已经存储了字典NSUserDefaults,我需要在该字典中添加/删除项目。

困扰我的是,要做到这一点,我必须创建整个字典的可变副本,更改一个元素并用新副本替换整个字典。

copy = [[defaults objectForKey:@"foo"] mutableCopy];
[copy setObject:… forKey:@"bar"];
[defaults setObject:copy forKey:@"foo"];

它涉及对层次结构更深的对象进行更多的复制和重新设置。

有没有更好的办法?

我试过使用[defaults setValue:… forKeyPath:@"foo.bar"],但这似乎不起作用(对象不可变)。

4

1 回答 1

5

我通常创建一个自定义类来保存我所有的应用程序偏好。该类可以在程序启动时加载 userDefaults 的可变副本一次,然后在此过程中处理所有增量保存:

我的首选项.h

@interface MyPreferences
{
   NSMutableDictionary allPrefs;
}
@property (readonly) NSMutableDictionary * allPrefs;
- (void)load;
- (void)save;
@end

我的首选项.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,例如。

于 2009-08-14T14:08:17.550 回答