【ios】NSCoding协议的使用

在IOS中,我们经常会把对象、集合装换成NSData类型,以便于更好的数据存储和数据处理。

eg: NSArray *array = [NSArray arrayWithObjects:@"aaa", @"bbb", @"ccc"]

      NSData *data02 = [NSKeyedArchiver archivedDataWithRootObject:array];//通过归档对NSArray进行转码,保存了数组的序列


但是,我们仅仅只能对原生的类进行归档处理,当对自定义的类进行归档时,无法保存对象,只是需要在自定义类中实现NSCoding协议。原来所有原生的类都是实现了NSCoding协议,在归档的过程中进行了转码,所以才可以归档成功。


NSCoding协议介绍

NSCoding协议中只有两个方法 都是require的方法,一个是把本身的类进行转码,一个是逆转码成类对象,返回一个对象。

- (void)encodeWithCoder:(NSCoder *)encoder

- (id)initWithCoder:(NSCoder *)decoder

NSCoding的使用:
例如一个自定义类StudentDoc类,实现NSCoding协议

@interfaceStudentDoc : NSObject<NSCoding>

@property (nonatomic, retain) NSString *name;

@property (nonatomic, retain) NSString *ID;


-(Student *)initWithName :(NSString*)newName 

                 and : (NSString *)newID;

@end

Student类需要实现协议NSCoding,.m文件中是这样的:

 

@implementationStudent

@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.IDforKey:@"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];//学生对象数组,里面包含stu1stu2


   NSData *stuData = [NSKeyedArchiver archivedDataWithRootObject:stuArray];//归档

   NSLog(@"data = %@",stuData);

   NSArray *stuArray2 =[NSKeyedUnarchiver unarchiveObjectWithData:stuData];//逆归档

   NSLog(@"array2 = %@",stuArray2);




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值