令我困扰的是,要做到这一点,我必须创建整个字典的可变副本,更改一个元素并用新副本替换整个字典.
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中的对象所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)