LoginSignup
0
0

More than 5 years have passed since last update.

NSUserDefaultsに多様なオブジェクトを格納する

Last updated at Posted at 2015-08-18

NSUserDefaultsに格納できるオブジェクトタイプは限定的

自分自身知らなかったのですが、NSUserDefaultsには setObject:forKey: なんてメソッドがあります。setObject:なんて言ってるのでテッキリ、どんなオブジェクトでも指定できるのかなと思ったのですが、案外そうでもなく、結局は plist に格納できるオブジェクトタイプに限定されている模様。
で、ドキュメントを見ても実際そのように書いてあるのですね...。

The value parameter can be only property list objects: NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary.

そしてまた、NSArrayNSDictionaryのようなコレクションクラスの場合、そのコレクション内に入れるものも上記のオブジェクトタイプに限られます。

オブジェクトを何とかシリアライズして保存する

例えばUIColorを保存したい場合はどうしましょうか。
考えてみれば、UIColorを何らかの方法でシリアライズすれば良いのだと思います。UIColorの場合は簡単で、色を扱うクラスですので R, G, B, Aの 4 要素を使ってシリアライズしても良いかと。
下記の例ですと、red, green, blue, alphaの要素をNSDictionary形態に変換しています。

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
UIColor *color = [UIColor redColor];

//格納
CGFloat r, g, b, a;
[color getRed:&r green:&g blue:&b alpha:&a];  //RGBA要素を取り出す
[userDefaults setObject:@{@"red":@(r), @"green":@(g), @"blue":@(b), @"alpha":@(a)} forKey:@"color"];

//取出し
NSDictionary *dic = [userDefaults objectForKey:@"color"];
r = ((NSNumber *)dic[@"red"]).doubleValue;
g = ((NSNumber *)dic[@"green"]).doubleValue;
b = ((NSNumber *)dic[@"blue"]).doubleValue;
a = ((NSNumber *)dic[@"alpha"]).doubleValue;
UIColor *color_new = [UIColor colorWithRed:r green:g blue:b alpha:a];

NSKeyedArchiverを使う

なにやら色々書きましたが...。NSCoding に準拠したクラスであれば、NSKeyedArchiverを使ってしまうのも手です。

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
UIColor *color = [UIColor redColor];

//格納
[userDefaults setObject:[NSKeyedArchiver archivedDataWithRootObject:color] forKey:@"color"];

//取出し
UIColor *color_new = [NSKeyedUnarchiver unarchiveObjectWithData:[userDefaults objectForKey:@"color"]];

ちなみに些細なことですが、 plist にNSDataを格納するとバイナリに base64 的なエンコードが掛かって文字列で格納されるようなので、少しファイルサイズが大きくなります。(plistがテキスト形態の場合)
保持するデータが単純なクラスの場合、できるだけNSDictionary形態の方が良いかも知れません。が、面倒さを考えたらやっぱりNSDataですかね...、些細な問題ですし。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0