iOS中复杂对象对象的归档返归档
归档与返归档听起来高大上,说的简单一些就是较之字符串,字典,数组等更复杂对象的写入与读取.
这里的复杂对象说的是Foundation框架内不存在类,假如我们自定义了一个类继承于NSObject
@interface Person : NSObject
@property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) NSString *sex;
@end
Person有两个属性name,sex
在ViewController的viewDidLoad方法中
我们创建两个对象
Person *p = [[Person alloc] init];
p.name = @"霸王";
p.sex = @"男";
Person *p1 = [[Person alloc] init];
p1.name = @"铁锤";
p1.sex = @"女";
这时候我们想以NSData类型保存这两个对象就需要用到NSKeyedArchiver类,读取用到NSKeyedUnarchiver注意两者的区别
接下来我们开始
第一步:
在自定义的类中接受协议<NSCoding>
@interface Person : NSObject<NSCoding>
@property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) NSString *sex;
@end
第二步:在Person.m中实现两个方法
归档(写入)
-(void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.sex forKey:@"sex"];
}
返归档(读取)
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
NSLog(@"调用了返归档方法");
self = [super init];
if (self) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.sex = [aDecoder decodeObjectForKey:@"sex"];
}
return self;
}
第三步:
写入
回到ViewController的viewDidLoad方法中
//NSDdata对象初始化
NSMutableData *data = [NSMutableData data];
//使用归档工具
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:p forKey:@"p"];
[archiver encodeObject:p1 forKey:@"p1"];
// 标志归档结束
[archiver finishEncoding];
// 保存到Document下person.dat中
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
path = [path stringByAppendingString:@"/person.dat"];
NSLog(@"%@",path);
[data writeToFile:path atomically:YES];
读取
NSData *readData = [[NSData alloc] initWithContentsOfFile:path]; // path是上文中路径
// 返归档用到的工具
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:readData];
Person *pp = [unarchiver decodeObjectForKey:@"p"];
Person *pp1 = [unarchiver decodeObjectForKey:@"p1"];
NSLog(@"%@--%@",pp.name,pp.sex);
NSLog(@"%@--%@",pp1.name,pp1.sex);