Kor*_*nel 6 cocoa copy nsdictionary nsuserdefaults
我已经存储了字典NSUserDefaults,我需要在这本字典中添加/删除项目.
令我困扰的是,要做到这一点,我必须创建整个字典的可变副本,更改一个元素并用新副本替换整个字典.
copy = [[defaults objectForKey:@"foo"] mutableCopy];
[copy setObject:… forKey:@"bar"];
[defaults setObject:copy forKey:@"foo"];
Run Code Online (Sandbox Code Playgroud)
它涉及对层次结构中更深层次的对象进行更多复制和重新设置.
有没有更好的办法?
我试过使用,[defaults setValue:… forKeyPath:@"foo.bar"]但似乎没有用(对象不可变).
我通常创建一个自定义类来保存我的所有应用程序首选项.当程序启动时,该类可以加载userDefaults的可变副本,然后在此过程中处理所有增量保存:
MyPreferences.h
@interface MyPreferences
{
NSMutableDictionary allPrefs;
}
@property (readonly) NSMutableDictionary * allPrefs;
- (void)load;
- (void)save;
@end
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我在我的应用程序委托中创建了这个类的实例,然后[myPrefs load]在我的应用程序启动时调用.程序运行时更改的任何首选项都可以通过修改myPrefs,然后通过调用保存[myPrefs save]:
MyPreferences * myPrefs = [myApplication myPrefs];
[myPrefs setObject:bar forKeyPath:@"allPrefs.foo.bar"];
[myPrefs save];
Run Code Online (Sandbox Code Playgroud)
作为额外的奖励,您可以MyPreferences按照自己喜欢的方式构建课程,将OO编程的好处带入整个首选项集.我在这里展示了简单的方法,只需使用一个可变字典,但你可以将每个首选项放入一个属性中,并对更复杂的对象进行前/后处理NSColor,例如.
| 归档时间: |
|
| 查看次数: |
2523 次 |
| 最近记录: |