在更改NSUserDefaults的对象,而无需创建和重新设置副本(Change objects i

2019-08-01 06:14发布

我有字典存储在NSUserDefaults ,我需要这个字典中添加/删除项目。

它困扰我,为此,我必须创建整个词典的可变副本,改变一个元素和替换整个词典与新副本。

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

它涉及更多的复制和重新设定为对象的层次更深。

有没有更好的办法?

我试着用[defaults setValue:… forKeyPath:@"foo.bar"]但似乎并没有工作(对象是不可变)。

Answer 1:

我通常创建一个自定义的类来保存所有我的应用程序的喜好。 这个类可以加载可变副本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 ,比如。



文章来源: Change objects in NSUserDefaults without creating and re-setting copies