我有字典存储在NSUserDefaults
,我需要这个字典中添加/删除项目。
它困扰我,为此,我必须创建整个词典的可变副本,改变一个元素和替换整个词典与新副本。
copy = [[defaults objectForKey:@"foo"] mutableCopy];
[copy setObject:… forKey:@"bar"];
[defaults setObject:copy forKey:@"foo"];
它涉及更多的复制和重新设定为对象的层次更深。
有没有更好的办法?
我试着用[defaults setValue:… forKeyPath:@"foo.bar"]
但似乎并没有工作(对象是不可变)。
我通常创建一个自定义的类来保存所有我的应用程序的喜好。 这个类可以加载可变副本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
类你喜欢的任何方式,把面向对象编程的好处整个偏好组。 我发现最简单的方式在这里,只需使用一个可变的字典,但你可以使每个偏好到属性,并像更复杂的对象做前/后处理NSColor
,比如。