/*
iOS歸檔小結:
1.歸檔實際上就是一種文件保存的形式,幾乎所有的對象都能夠被歸檔存儲。它使用NSKeyedArchiver進行歸檔(歸檔的數據為:二進制數據)、NSKeyedUnarchiver進行解檔,它會在寫入、讀出數據(二進制數據)之前對數據進行序列化、反序列化操作。
2.另外也需要介紹一下:NScoder 和 NScoding,NScoder 和 NScoding有將自己定義的類的對象寫入磁盤的作用,-(id)initWithCoder:(NSCoder )coder;//從coder中讀取數據,保存到相應的變量中,即反序列化數據
-(void)encodeWithCoder:(NSCoder )coder;// 讀取實例變量,并把這些數據寫到coder中去。序列化數據
NSCoder 是一個抽象類,抽象類不能被實例話,只能提供一些想讓子類繼承的方法。
*/
/*
單一對象的歸檔
NSString* path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)firstObject];//緩存路徑
NSString* archivePath = [path stringByAppendingPathComponent:@"archive.plist"];
NSLog(@"%@",archivePath);
NSArray* arrMut =@[@{@"asd":@"12",@"asd1":@"12",@"asd2":@"12"},@{@"asd2":@"12"}];
//歸檔--序列化
[NSKeyedArchiver archiveRootObject:arrMut toFile:archivePath];
NSArray* unArr = [NSKeyedUnarchiver unarchiveObjectWithFile:archivePath];//解檔---反序列化
NSLog(@"%@",unArr);
*/
/*多個對象的歸檔*/
NSString* path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)firstObject];//緩存路徑
NSString* archivePath = [path stringByAppendingPathComponent:@"archive.plist"];
NSLog(@"%@",archivePath);
//歸檔
NSMutableData* data = [[NSMutableData alloc]init];
NSKeyedArchiver* archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
//對多個對象歸檔
[archiver encodeBool:YES forKey:@"isOr"];
[archiver encodeFloat:12.356 forKey:@"floatwe"];
[archiver finishEncoding];
[data writeToFile:archivePath atomically:YES];
//解檔
NSMutableData* data1 = [[NSMutableData alloc]initWithContentsOfFile:archivePath];
NSKeyedUnarchiver* unarchive = [[NSKeyedUnarchiver alloc]initForReadingWithData:data1];
BOOL iOS = [unarchive decodeBoolForKey:@"isOr"];
float floatwe = [unarchive decodeFloatForKey:@"floatwe"];
[unarchive finishDecoding];
NSLog(@"%d %f",iOS,float);
-------------------歸檔和解檔結合Model實現-----------------------------
import <Foundation/Foundation.h>
@interface Worker : NSObject<NSCoding>
@property (nonatomic,strong) NSString* name;//姓名
@property (nonatomic,assign) NSString* age;//年齡
@property (nonatomic,strong) NSString* workType;//職業
@property (nonatomic,assign) NSString* wage;//工資
@property (nonatomic,assign) NSString* workTime;//工作年限
@property (nonatomic,strong) NSDictionary* dict;
- (instancetype)initWithDict:(NSDictionary *)dic;
@end
import "Worker.h"
@implementation Worker
- (instancetype)initWithDict:(NSDictionary *)dic{
// self = [super init];
if ( self = [super init]) {
self.dict = dic;
}
return self;
}
- (void)setDict:(NSDictionary *)dict{
self.name = [dict objectForKey:@"name"];
self.age = [dict objectForKey:@"age"] ;
self.workType = [dict objectForKey:@"workType"];
self.wage = [dict objectForKey:@"wage"] ;
self.workTime = [dict objectForKey:@"workTime"];
}
-
(void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.age forKey:@"age"];
[aCoder encodeObject:self.workType forKey:@"workType"];
[aCoder encodeObject:self.wage forKey:@"wage"];
[aCoder encodeObject:self.workTime forKey:@"workTime"];
} -
(id)initWithCoder:(NSCoder *)aDecoder{
self = [super init];
if (self) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeObjectForKey:@"age"];
self.workType = [aDecoder decodeObjectForKey:@"workType"];
self.wage = [aDecoder decodeObjectForKey:@"wage"];
self.workTime = [aDecoder decodeObjectForKey:@"workTime"];
}
return self;
}
@end
具體用法:
NSDictionary* dict = @{@"name":@"zxc",@"age":@"5",@"workType":@"iOS",@"wage":@"50",@"workTime":@"2"};
Worker* work = [[Worker alloc]initWithDict:dict];
NSString* path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)firstObject];//緩存路徑
NSString* archivePath = [path stringByAppendingPathComponent:@"worker.plist"];
NSLog(@"%@",archivePath);
if ([NSKeyedArchiver archiveRootObject:work toFile:archivePath]) {
Worker* worker = [NSKeyedUnarchiver unarchiveObjectWithFile:archivePath];
NSLog(@"%@ %@ %@ %@ %@",worker.age,worker.name,worker.workTime,worker.workType,worker.wage);
}