私のアプリは、[NSUserDefaults standardUserDefaults] を、ユーザーとアプリ自体に関する状態を格納するための迅速で汚れたデータベースとして使用しています。NSUserDefaults の問題点は、その柔軟性によって、たとえば、さまざまなファイルが辞書内のさまざまなキーを独自の方法で設定および読み取る場合など、大きな混乱が生じることです。ルールを強制することはできません。キー名などを台無しにすることができます..
NSUserDefaults 用の単純なシングルトン「マネージャー スタイル」ラッパーを作成しました。これは、使用時にデフォルト値の設定を処理し、値のフェッチに使用されるキーの名前を非表示にし、保存時に NSData へのエンコードなどの追加ロジックをカプセル化します。ストアからオブジェクトを取得します。
現時点では、それらは read/set アクセサーによってサポートされているプロパティですが、何かが間違っているので、同じ結果を達成するためのよりエレガントな方法があるのではないかと考えています。かなりの定型文があり、構文はやや不快になります。例を挙げると:
.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;