NSCcoding是一个协议,基本上所有的原生的类都是实现了NSCoding协议,在归档的过程中进行了转码,所以才可以归档成功。
@protocol NSCoding
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder; // NS_DESIGNATED_INITIALIZER
@end
NSCcoding协议两个必须实现的方法!
而且NSCoding多用于对自定义的类的实体对象进行归档,比如写一个student类
@interface Student : NSObject@property (nonatomic , retain) NSString *name;
@property (nonatomic , retain) NSString *ID;
-(Student *)initWithName : (NSString *)newName
and : (NSString *)newID;
@end
Student类需要实现协议NSCoding,.m文件中是这样的:
@implementation Student
@synthesize name = _name,ID = _ID;
//初始化学生类
-(Student *)initWithName:(NSString *)newName and:(NSString *)newID{
self = [super init];
if (self) {
self.name = newName;
self.ID = newID;
}
return self;
}
//学生类内部的两个属性变量分别转码
-(void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.ID forKey:@"ID"];
}
//分别把两个属性变量根据关键字进行逆转码,最后返回一个Student类的对象
-(id)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.ID = [aDecoder decodeObjectForKey:@"ID"];
}
return self;
}
@end
自定义类Student实现了NSCoding协议以后,就可以进行归档转换了,具体实现:
Student *stu1 = [[Student alloc]initWithName:@"124" and:@"111"];//学生对象stu1
Student *stu2 = [[Student alloc]initWithName:@"223" and:@"222"];//学生对象stu2
NSArray *stuArray = [NSArray arrayWithObjects:stu1,stu2, nil];//学生对象数组,里面包含stu1和stu2
NSData *stuData = [NSKeyedArchiver archivedDataWithRootObject:stuArray];//归档
NSLog(@"data = %@",stuData);
NSArray *stuArray2 = [NSKeyedUnarchiver unarchiveObjectWithData:stuData];//逆归档
NSLog(@"array2 = %@",stuArray2);
在IOS的开发中,小数据量的持久化都用NSUserDefaults来实现,但是NSUserDefaults只能保存NSString, NSNumber, NSDate, NSArray, NSDictionary这些数据类型,但大多时候,我们会将一个对象实体做持久化的保存,由于不是大批量的数据,不会用到sqlite,那么这个时候NSUserDefaults会是很好的选择,其实对象类型可以通过NSCoding的委托方法来实现的。