我的应用程序使用[NSUserDefaults standardUserDefaults]作为快速而脏的数据库来存储有关用户和应用程序本身的状态。 NSUserDefaults的问题在于它的灵活性允许线下很乱,例如当不同的文件都以自己的方式设置和读取字典中的不同键时。你没有强制执行规则,你可以搞砸关键名称等。
我为NSUserDefaults编写了一个简单的单独“管理器式”包装器,它在使用时都负责设置默认值,隐藏用于获取值的键的名称并封装一些额外的逻辑,例如编码到NSData,在存储和检索商店中的对象时。
此时它们的属性由读取/设置访问器支持,但有些东西让我误解了,我想知道是否有更优雅的方法来实现相同的结果。有相当多的样板,语法最终有点不愉快。举个例子:
·H:
@interface UserDefaultsManager: NSObject
+ (UserDefaultsManager *)sharedInstance;
@property (nonatomic, assign) NSInteger somethingImTracking;
@end
和.m:
NSString * const kSomethingImTracking= @"SomethingImTracking";
@implementation UserDefaultsManager
[...]
- (NSInteger)somethingImTracking
{
return [[[NSUserDefaults standardUserDefaults] objectForKey:kSomethingImTracking] intValue];
}
- (void)setSomethingImTracking:(NSInteger)somethingImTracking
{
[[NSUserDefaults standardUserDefaults] setInteger:somethingImTracking forKey:kSomethingImTracking];
}
并访问:
NSInteger foo = [UserDefaultsManager sharedInstance].somethingImTracking;
答案 0 :(得分:4)
我个人使用字符串常量来存储键名,只是直接访问用户默认对象,但我不倾向于在很大程度上使用默认值,或者在许多不同的类中使用默认值。
我对您的代码所做的一项改进是将它们全部作为类方法。单例没有任何好处(你没有维护任何状态,这都是在defaults对象中)并且这会从你的使用模式中获得一些丑陋的重复代码(...sharedInstance
)。
synchronize
。只有在快速连续访问不同线程的默认值时才需要它。操作系统也会定期调用它。