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つの方法にほかならない、カスタムオブジェクトを含む配列をディスクにシーケンス化することも実現する.
間違いがあれば皆さんの批判と指摘を歓迎します.