1、NSCoding初步学习

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的委托方法来实现的。

你可能感兴趣的:(1、NSCoding初步学习)