数据解档和归档
数据解档和归档
"一,对一个对象进行归档-解档(字符串,数字,字典,数组)
//1.获取文件路径
NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
//2、添加储存的文件名
NSString *path = [docPath stringByAppendingPathComponent:@"data.archiver"];
//3、将一个对象保存到文件中
BOOL flag = [NSKeyedArchiver archiveRootObject:@"name" toFile:path];
//1.获取文件路径
NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *path=[docPath stringByAppendingPathComponent:@"data.archiver"];
NSLog(@"path=%@",path);
//2.从文件中读取对象
[NSKeyedUnarchiver unarchiveObjectWithFile:path]
"二,对多个对象进行归档-解档
//准备数据
CGPoint point = CGPointMake(1.0, 2.0);
NSString *origin = @"坐标原点";
NSInteger value = 10;
NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *path = [docPath stringByAppendingPathComponent:@"multi.archiver"];
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archvier = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
//对多个对象进行归档
[archvier encodeCGPoint:point forKey:@"kPoint"];
[archvier encodeObject: origin forKey:@"kOrigin"];
[archvier encodeInteger:value forKey:@"kValue"];
[archvier finishEncoding];
[data writeToFile:path atomically:YES];
NSMutableData *dataR = [[NSMutableData alloc] initWithContentsOfFile:multiHomePath];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:dateR];
CGPoint pointR = [unarchiver decodeCGPointForKey:@"kPoint"];
NSString *infoR = [unarchiver decodeObjectForKey:@"kInfo"];
NSInteger valueR = [unarchiver decodeIntegerForKey:@"kValue"];
[unarchiver finishDecoding];
NSLog(@"%f,%f,%@,%d",pointR.x,pointR.y,infoR,valueR);
"三,对自定义对象进行归档-解档
1.首先需要实现在类中实现两个方法
//归档只是一个过程 告诉系统 你到底保存对象的 哪些属性
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeInteger:_age forKey:@"age"];
}
//解档只是一个过程 告诉系统 你到底 想取出 该对象的 哪些属性
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
if(self = [super init]){
_name = [aDecoder decodeObjectForKey:@"name"];
}
return self;
}
HMPig *pig = [[HMPig alloc] init];
pig.name = @"小花";
pig.age = 18;
NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"data.plist"];
//归档
[NSKeyedArchiver archiveRootObject:pig toFile:filePath];
//取数据
NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"data.plist"];
//反归档 解档
HMPig *pig = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];


/*
注意
如果需要归档的类是某个自定义类的子类时,就需要在归档和解档之前先实现父类的归档和解档方法。即 [super encodeWithCoder:aCoder] 和 [super initWithCoder:aDecoder] 方法;
必须遵循并实现NSCoding协议
归档和解归档其中任意对象都需要归档和解归档整个文件
归档后的文件是加密的,保存文件的扩展名可以任意指定

浙公网安备 33010602011771号