歸檔
歸檔->數據持久化的方式->加密(把文件加密《不是把數據加密》
歸檔分為:
1、存儲數據(編碼、序列化、歸檔過程)
2、讀取數據(解碼、反序列化、解歸檔過程)
*可以歸檔的對象:必須遵守歸檔協議(NSSecureCoding遵守NSCoding)、實現協議方法
*除了NSObject未實現歸檔協 議其他實現了協議的類都可以歸檔(UIViewController、UIView...)
歸檔類名:NSKeyedArchiver
解歸檔類名:NSKeyedUnarchiver
*歸檔、解歸檔都是通過key來實現的
*在歸檔、解歸檔的時候key一定要對應(盡量和對象名相同)
歸檔的步驟:
1、寫存儲歸檔文件的路徑
NSArray*searchList = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES);
*歸檔文件的尾綴盡量用.archiver
NSString*path = [[searchList lastObject]stringByAppendingPathComponent:@"list.archiver"];
2、準備要歸檔的數據
NSArray *list =@[@{@"name":@"小明",@"age":@(18),@"height":@(18.5)}];
3、開始歸檔
*把一個Object(支持歸檔)的數據以歸檔的形式存儲到指定位置
+ (BOOL)archiveRootObject:(id)rootObject toFile:(NSString
*)path;
*支持歸檔協議的對象系統幫忙對他進行了編碼
BOOLisSuccess = [NSKeyedArchiverarchiveRootObject:list toFile:path];
if(isSuccess) {
NSLog(@"%@",path);
}
解歸檔的步驟:
1、歸檔文件路徑
2、開始解歸檔
+ (nullable id)unarchiveObjectWithFile:(NSString *)path
NSArray
*list = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
#pragma mark---NSData二進制的類---
*NSData二進制的類可以把文件或者數據轉成二進制的對象
多種數據歸檔步驟:
1、存儲路徑
NSArray *searchList = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*path = [[searchListlastObject]stringByAppendingPathComponent:@"user.archiver"];
2、初始化一個可變的二進制對象**NSMutableData同時準備要歸檔的數據
NSString *name =@"mary";
NSIntegerage =18;
floatheight =172.5;
NSMutableData*Data = [NSMutableDatadata];
3、歸檔等待寫入數據的二進制對象(要把二進制對象寫入到文件)->讓歸檔對象幫他寫入
NSKeyedArchiver *arc = [[NSKeyedArchiver
alloc]initForWritingWithMutableData:Data];
4、使用歸檔對象對要歸檔的數據進行編碼(同時寫入到二進制對象-系統幫咱們操作)(編碼結束就會把編碼后的數據寫入二進制對象)
*編碼:encode解碼:decode
*要用對應的數據類型進行編碼
[arc encodeObject:name forKey:@"name"];
[arc encodeInteger:age forKey:@"age"];
[arc encodeFloat:height forKey:@"height"];
5、編碼結束
*把編碼之后數據寫入到二進制對象
[arc finishEncoding];
6、把二進制對象存儲到指定位置
BOOLisSuccess = [Data writeToFile:pathatomically:YES];
if(isSuccess) {
NSLog(@"%@",path);
多種解歸檔:
**decode解碼
- (instancetype)initForReadingWithData:(NSData *)data
1、歸檔文件路徑
2、使用data讀取數據準備解歸檔data里面的數據
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver
alloc]initForReadingWithData:[NSData dataWithContentsOfFile:path]];
3、解歸檔數據用對應的數據類型接收
NSString*name = [unarchiver decodeObjectForKey:@"name"];
NSIntegerage = [unarchiver decodeIntegerForKey:@"age"];
floatheight = [unarchiver decodeFloatForKey:@"height"];
NSLog(@"%@
%ld? %f",name,age,height);
*自定義歸檔*:
自定義歸檔->有些數據不能歸檔->讓他遵守歸檔協議(NSCoding)->
歸檔、解歸檔都與第一種方式相同
userModel *user = [[userModel alloc]init];
user.name =@"江兒";
user.age=18;
user.height =165.5;
NSString*path = [NSHomeDirectory()stringByAppendingPathComponent:@"user.archiver"];
BOOLisOK = [NSKeyedArchiverarchiveRootObject:user toFile:path];
if(isOK) {
NSLog(@"%@",path);
}
userModel*userMode= [NSKeyedUnarchiverunarchiveObjectWithFile:path];
NSLog(@"%@ %ld %f",userMode.name,userMode.age,userMode.height);
當在歸檔位置(viewController中)調用[NSKeyedArchiver archiveRootObject:XXX toFile:XXX];會自動調用encodeWithCoder:這個代理方法
使用**歸檔方法對對象歸檔的時候會調用這個方法
- (void)encodeWithCoder:(NSCoder *)aCoder{
aCoder就是系統傳過來的NSKeyedArchiver實例化出來的對象
[aCoderencodeObject:self.name forKey:@"name"];
[aCoderencodeInteger:self.age forKey:@"age"];
[aCoderencodeFloat:self.height forKey:@"height"];
}
使用**解歸檔方法對對象解歸檔的時候會調用這個方法
- (nullableinstancetype)initWithCoder:(NSCoder*)aDecoder{
只要是構造方法先把創建對象的方法補全
//self = [super init];
//if(self) {
//}
//return self;
self= [super init];
if(self) {
當使用解歸檔方法的時候系統會自動調用initWithCoder:這個方法系統會幫咱們創建一個對象
之前的對象的數據保存在歸檔文件里面
在解歸檔的時候還原數據并且把還原的數據賦值給這個對象->現在這個對象的數據跟原來歸檔的數據是一樣的
self.name = [aDecoderdecodeObjectForKey:@"name"];
self.age = [aDecoderdecodeIntegerForKey:@"age"];
self.height = [aDecoderdecodeFloatForKey:@"height"];
}
returnself;
}