上文归档中没有提到的对自定义的对象归档,当我们对自定义的对象进行归档时会报错,因为程序对自定义的对象归档不知道该怎么编码解码,所以我们可以通过实现NSCoding协议的相关方法来告诉程序如何编码解码我们自定义类的对象,
代码:
自定义类遵守NSCoding协议,并且实现一下两个方法
#pragma mark---NSCoding
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.nameforKey:@"PersonName"];
// [aCoder encodeObject:self.age forKey:@"personAge"];
[aCoder encodeInt:self.ageforKey:@"personAge"];
}
- (nullableinstancetype)initWithCoder:(NSCoder *)aDecoder{
self.name = [aDecoderdecodeObjectForKey:@"PersonName"];
self.age = [aDecoderdecodeIntForKey:@"personAge"];
returnself;
}
这样我们就可以对自定义类的对象进行归档操作了,
person *per = [[personalloc] init];
per.name =@"zhangsan";
per.age =12;
person *new = [percopy];
new.name =@"lisi";
new.age =13;
NSMutableArray *arry1 = [NSMutableArrayarrayWithObjects:per,new,nil];
NSString *filePath =@"";
NSString *arrPath = [filePathstringByAppendingPathComponent:@"arr.archiver"];
//归档
[NSKeyedArchiverarchiveRootObject:arry1 toFile:arrPath];
//反归档
NSArray *arrUnarch = [NSKeyedUnarchiverunarchiveObjectWithFile:arrPath];
for (person *pin arrUnarch) {
NSLog(@"%@",p.name);
}
方法+1
NSMutableData *archiverData =[NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:archiverData];
[archiver encodeObject:arry1 forKey:@"array1"];
[archiver encodeObject:per forKey:@"person"];
[archiver finishEncoding];
[archiverData writeToFile:arrPath atomically:YES];
NSMutableData *UnarchiverData = [NSMutableData dataWithContentsOfFile:arrPath];
NSKeyedUnarchiver *Unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:UnarchiverData];
NSArray *arr3 = [Unarchiver decodeObjectForKey:@"array1"];
person *per3 = [Unarchiver decodeObjectForKey:@"person"];