6

我的应用程序使用 [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;
4

1 回答 1

4

就我个人而言,我使用字符串常量来存储键名,并且直接访问用户默认对象,但我不倾向于在很大程度上使用默认值,或者在许多不同的类中使用默认值。

我对您的代码所做的一项改进是将它们全部作为类方法。单例没有任何好处(您没有维护任何状态,这一切都在默认对象中),这...sharedInstance从您的使用模式中去除了一些难看的重复代码 ( )。

synchronize不必每次设置都包含。只有在快速连续地从不同线程访问默认值时才需要它。操作系统也会定期调用它自己。

于 2012-12-28T07:49:20.697 回答