cocoa – 在不创建和重新设置副本的情况下更改NSUserDefaults中的对象

cocoa – 在不创建和重新设置副本的情况下更改NSUserDefaults中的对象,第1张

概述我已经在NSUserDefaults中存储了字典,我需要在这个字典中添加/删除项目. 令我困扰的是,要做到这一点,我必须创建整个字典的可变副本,更改一个元素并用新副本替换整个字典. copy = [[defaults objectForKey:@"foo"] mutableCopy];[copy setObject:… forKey:@"bar"];[defaults setObject:co 我已经在NSUserDefaults中存储了字典,我需要在这个字典中添加/删除项目.

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

copy = [[defaults objectForKey:@"foo"] mutablecopy];[copy setobject:… forKey:@"bar"];[defaults setobject:copy forKey:@"foo"];@H_301_14@  

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

有没有更好的办法?

我曾尝试使用[defaults setValue:… forKeyPath:@“foo.bar”]但这似乎不起作用(对象不可变).

解决方法 我通常创建一个自定义类来保存我的所有应用程序首选项.当程序启动时,该类可以加载userDefaults的可变副本,然后在此过程中处理所有增量保存:

MyPreferences.h

@interface MyPreferences{   NSMutableDictionary allPrefs;}@property (Readonly) NSMutableDictionary * allPrefs;- (voID)load;- (voID)save;@end@H_301_14@  

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@H_301_14@  

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

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

作为额外的奖励,您可以按照自己喜欢的方式构建MyPreferences类,将OO编程的好处带入整个首选项集.我在这里展示了简单的方法,只需使用一个可变字典,但你可以将每个首选项放入一个属性,并为更复杂的对象(如NScolor)进行前/后处理.

总结

以上是内存溢出为你收集整理的cocoa – 在不创建和重新设置副本的情况下更改NSUserDefaults中的对象全部内容,希望文章能够帮你解决cocoa – 在不创建和重新设置副本的情况下更改NSUserDefaults中的对象所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1017313.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存