2015年

5月

21日

Objective-C  NSUserDefault:読込・保存・削除

アプリケーションの設定値など、アプリを停止させてもずっと保持しておきたい情報などはよくありますが、NSUserDefaultsを使うとそうしたデータを簡単に保持できます。

ViewController.m

使い方としては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

  

目 次