NSUserDefaults,NSCodingの使用

3541 ワード

NSUserDefaultsの概要:


NSUserDefaults自体は単一の例であり、プログラム全体に1つのインスタンスオブジェクトしかなく、データの永続化の1つの方法であり、使用も便利である.

NSUserDefaultsに格納されているデータの場所:


保存場所はLibraryPreferencesです.plistは、その格納場所が見つけやすいため、重要なデータやプライバシーのデータ(暗号化後の格納を除く)を格納することを推奨せず、いくつかの構成情報を格納することができる

NSUserDefaultsストレージでサポートされるデータ型:


NSUserDefaultsがサポートするデータ型はNSNumber(NSInteger、float、double)、NSString、NSDate、NSData、NSArray、NSDictionary、BOOLがあります.もちろんNSUserDefaultsは他のタイプのデータを直接保存することはできませんが、他のタイプのNSUserDefaultsが直接保存できるタイプに変換して保存することができます.以下ではNSUserDefaultsでカスタムオブジェクトを保存することについて言及します.NSCodingに使用します

注意すべき点:


NSUSerDefaultsは可変タイプで保存されています.たとえば、保存するのは可変配列です.保存する前にまず可変配列で受け入れてください.
くだらないことが多すぎて、コードが歩き始めた.
例1:NSUserDefaultsを使用してNSStringオブジェクトにアクセスする(他のタイプのメソッドを格納するのと同様)
- (void)action1{
    // 
    NSString *hobby = @"LOL";
    NSUserDefaults *person = [NSUserDefaults standardUserDefaults];
    [person setObject:hobby forKey:@"hobby"];
    // 
    NSString *str = [person objectForKey:@"hobby"];
    NSLog(@" %@",str);
    // :2016-02-17 11:04:26.075 NSUserDefaults[1497:53860]  LOL
}

例2:NSUserDefaultsを使用してカスタムオブジェクトを保存する
NSUserDefaults自体はカスタムオブジェクトのストレージをサポートしていませんが、NSDataのタイプをサポートしています.まず、LOLヒーローのクラスHeroを新規作成することができます.
//
//  Hero.h
//  NSUserDefaults
//
//  Created by yyMae on 16/2/17.
//  Copyright © 2016  yyMae. All rights reserved.
//   LOL 

#import 

@interface Hero : NSObject// NSCoding 
@property (nonatomic, copy)NSString *HP;// 
@property (nonatomic, copy)NSString *MP;// 
@property (nonatomic, copy)NSString *SP;// 
@end


//
//  Hero.m
//  NSUserDefaults
//
//  Created by yyMae on 16/2/17.
//  Copyright © 2016  yyMae. All rights reserved.
//

#import "Hero.h"

@implementation Hero
// NSCoding 
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
    self = [super init];
    if (self) {
        self.HP = [aDecoder decodeObjectForKey:@"HP"];
        self.MP = [aDecoder decodeObjectForKey:@"MP"];
        self.SP = [aDecoder decodeObjectForKey:@"SP"];
    }
    return self;
}

-(void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:self.HP forKey:@"HP"];
    [aCoder encodeObject:self.MP forKey:@"MP"];
    [aCoder encodeObject:self.SP forKey:@"SP"];
}
@end

そして、以下の具体的な操作を見て、実はとてもeasy-(void)action 2{////初期化の2つの英雄:寒氷と蛮王(二人は夫婦)Hero*hanBing=[[Heroalloc] init];hanBing.HP=@"400";hanBing.MP=@"200";hanBing.SP=@"0";Hero*manWang=[[Heroalloc] init];manWang.HP=@"420";manWang.MP=@"0";manWang.SP=@"0";hanBing.SP=@"50";//NSDataでNSData*hanBingData*=[NSKeydArchiver archivedDataWithRootObject:hanBing]; NSData *manWangData = [NSKeyedArchiver archivedDataWithRootObject:manWang];//可変配列にNSArray*heroArr=[NSArray array];heroArr = @[hanBingData,manWangData];//砂箱NSUserDefaults*heroes=[NSUserDefaults standardUserDefaults];[heroes setObject:heroArr forKey:@"heroes"];//英雄データNSArray*array=[heroes objectForKey:@"heroes"];for (NSData *heroData in array) { Hero hero = [NSKeyedUnarchiver unarchiveObjectWithData:heroData]; NSLog(@"HP:%@ MP:%@ SP:%@",hero.HP,hero.MP,hero.SP); }/印刷結果:2016-02-17 12:06:15.005 NSUserDefaults[192:85145]HP:400 MP:200 SP:00 2016-02-17 12:06:15.005 NSUserDefaults[192:85145]HP:420 MP:0 SP:50*/}
例2は、NSCodingプロトコルを実現する2つの方法にほかならない、カスタムオブジェクトを含む配列をディスクにシーケンス化することも実現する.
間違いがあれば皆さんの批判と指摘を歓迎します.