アプリケーションの設定値など、アプリを停止させてもずっと保持しておきたい情報などはよくありますが、NSUserDefaultsを使うとそうしたデータを簡単に保持できます。
使い方としてはNSUserDefaultsを取得して、取得したNSUserDefaultsに対してデータを保存したり取り出したりすることでデータ保持を行います。
#import "ViewController.h"
@interface ViewController () {
// NSUserDefaultsオブジェクト
NSUserDefaults *_def;
}
@property (weak, nonatomic) IBOutlet UITextField *tfValInt;
@property (weak, nonatomic) IBOutlet UITextField *tfValString;
@property (weak, nonatomic) IBOutlet UIImageView *ivImage;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 準備処理
[self doReady];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
// キーボードのReturnボタンがタップされたらキーボードを閉じるようにする
// ※UITextFiledの以下デリゲートメソッドを実装する
// Did End On Exit
- (IBAction)doEndTextFiled:(id)sender {
[self.tfValInt resignFirstResponder];
[self.tfValString resignFirstResponder];
}
// 準備処理
- (void)doReady {
// NSUserDefaultsオブジェクト生成
_def = [NSUserDefaults standardUserDefaults];
// 初期値の設定
{
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setObject:@"999" forKey:@"INT01"];
[dic setObject:@"Def" forKey:@"STR01"];
[_def registerDefaults:dic];
}
}
// キーボードのReturnボタンがタップされたらキーボードを閉じるようにする
// ※UITextFiledの以下デリゲートメソッドを実装する
- (IBAction)act:(id)sender {
[self.tfValInt resignFirstResponder];
[self.tfValString resignFirstResponder];
}
// [データ読込]ボタン押した時 readValue
- (IBAction)read:(id)sender {
// データ読込(int)
NSInteger bufInt = [_def integerForKey:@"INT01"];
self.tfValString.text = [NSString stringWithFormat:
@"%ld", (long)bufInt]; // 32bit 64bit 対応long
// データデータ読込(NSString)
NSString *bufStr = [_def stringForKey:@"STR01"];
self.tfValString.text = bufStr;
// データ読込
NSData *bufDat = [_def dataForKey:@"DAT01"];
UIImage *bufImg = [UIImage imageWithData:bufDat];
self.ivImage.image =bufImg;
}
// [データ保存]ボタン押した時 saveValue
- (IBAction)save:(id)sender {
// データ保存(int) 型変換
NSInteger bufInt = [self.tfValInt.text integerValue];
[_def setInteger:bufInt forKey:@"INT01"];
// データ保存(NSSTring)
NSString *bufStr = self.tfValString.text;
[_def setObject:bufStr forKey:@"STR01"];
// データ保存(NSData)
UIImage *bufImg = [UIImage imageNamed:@"img01"];
NSData *bufDat = UIImagePNGRepresentation(bufImg);
[_def setObject:bufDat forKey:@"DAT01"];
// 保存反映
BOOL ret = [_def synchronize];
NSLog(@"%@", ret ? @"保存確認":@"保存失敗");
}
// [削除]ボタン押した時 deleteValue
- (IBAction)delete:(id)sender {
// // 個別削除
// [_def removeObjectForKey:@"INT01"];
// // 実行確定
// [_def synchronize];
// 一括削除
NSString *bi = [[NSBundle mainBundle] bundleIdentifier];
[_def removePersistentDomainForName:bi];
// NSLog (@"削除");
}
@end
NSDictionary
インスタンスの生成は @{} を使おう
Beafore
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
@"value1",
@"key1",
@"value2",
@"key2",
@"value3",
@"key3",
nil];
NSMutableDictionary *multiDictionary = [NSMutableDictionary
dictionaryWithObjectsAndKeys:
@"value4", @"key4",
@"value5", @"key5",
@"value6", @"key6",
nil];
↓
After
NSDictionary *dictionary = @{@"key1":@"value1",
@"key2":@"value2",
@"key3":@"value3"};
NSMutableDictionary *multiDictionary = [@{@"key4":@"value4",
@"key5":@"value5",
@"key6":@"value6"}
mutableCopy];
NSMutableDictionaryでmutableCopyを使っているのは、可読性をあげるためらしい。
要素の取得には objectForKey: は使わない
サンプルコードではよくある記述
Beafore
NSDictionary *dictionary = @{@"key1":@"value1",
@"key2":@"value2",
@"key3":@"value3"};
id obj = [dictionary objectForKey:@"key1"];
// obj = value1
↓
After
id obj = dictionary[@"key1"];
// obj = value1
他の言語と同じ記述になった
要素の追加・置換には setObject:forKey: は使わない
Beafore
NSDictionary *dictionary = @{@"key1":@"value1",
@"key2":@"value2"};
NSMutableDictionary *mutableDic = [dictionary mutableCopy];
[mutableDic setObject:@"value3" forKey:@"key3"];
↓
After
mutableDic[@"key3"] = @"value3";
GitHub UserDefault
コメントをお書きください