cocoa - 更改 NSUserDefaults 中的对象,无需创建和重新设置副本

标签 cocoa copy nsdictionary nsuserdefaults

我的字典存储在 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

我在应用程序委托(delegate)中创建此类的实例,然后在应用程序启动时调用[myPrefs load]。程序运行时更改的任何首选项都可以通过 myPrefs 进行修改,然后根据需要调用 [myPrefs save] 进行保存:

MyPreferences * myPrefs = [myApplication myPrefs];
[myPrefs setObject:bar forKeyPath:@"allPrefs.foo.bar"];
[myPrefs save];

作为一个额外的好处,您可以按照您喜欢的任何方式构建 MyPreferences 类,从而将 OO 编程的优势引入到整套首选项中。我在这里展示了简单的方法,只需使用可变字典,但您可以将每个首选项放入属性中,并对更复杂的对象(例如 NSColor)进行预处理/后处理。

关于cocoa - 更改 NSUserDefaults 中的对象,无需创建和重新设置副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1277755/

相关文章:

objective-c - 将一组托管对象转换为字典?

macos - 如何在Cocoa中绘制PDF上下文

macos - AppKit:持续时间选择器 View

objective-c - 在代码中将 NSTreeController 绑定(bind)到 NSOutlineView

pointers - 一个人怎么能用 F# 编写 Duff 的设备?

ios - 如何解析未命名数组的 NSDictionary

macos - 为什么 AXUIElementCopyAttributeValue() 会为此函数中屏幕上的每个窗口返回 kAXErrorAttributeUnsupported ?

Windows x64 上的 Python x64 位复制文件性能评估/问题

string - Delphi:奇怪的子字符串结果

iphone - 使用 UITableView 的键值对