我通常會創建一個自定義類來容納我的所有應用程序首選項。這個類可以加載可變副本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
)執行預/後處理。