iOS开发-归档

前言

归档:将对转序列化成二级制数据,并保存在文件中。
解归档:将归档后的数据反序列化成明码(能够看懂)对象,供我们使用。

说明:只有遵守了NSCoding或 NSSecureCoding协议,并且实现了协议里归档与解归档的方法的的类创建的对象才能够进行归档。

  //归档时会自动调用encodeWithCoder:(NSCoder *)aCoder
  - (void)encodeWithCoder:(NSCoder *)aCoder

  // 解归档的时候 会自动调用 initWithCoder:(NSCoder *)aDecoder
  - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder

将单个对象归档与解归档

iOS开发-归档_第1张图片

采用archiveRootObject方法在同一路经下只能归档一个对象。但如果此时我想将我传进来的名字和年龄都归档,只需将这两个数据放到一个字典对象里。让后将字典给归档便可。将归档方法变为如下即可。

- (void)archiverName:(NSString *)name WithAge:(NSNumber *)age {

 //[NSKeyedArchiver archiveRootObject:name toFile:path];

 //[NSKeyedArchiver archiveRootObject:age toFile:path];

 NSMutableDictionary *dict = [NSMutableDictionary dictionary];

 dict[@"name"] = name;
 dict[@"age"] = age;

 [NSKeyedArchiver archiveRootObject:dict toFile:path];

 //验证是否将字典给归档
 id content =  [NSKeyedUnarchiver unarchiveObjectWithFile:path];
 NSLog(@"%@",content);
 }

对自定义的类的单个对象创建的对象归档与解归档

iOS开发-归档_第2张图片
Person是我自定义的一个类
在前言部分咱们说过只有遵守了NSCoding或NSSecureCoding(更为安全的归档协议,想要深入了解可以留下评论)协议,并且实现了协议里归档与解归档的方法的的类创建的对象才能够进行归档。

因此我们需要对Person类做以下操作。

遵守NSCodeing协议(暂不考虑NSSecureCoding)

  • 实现-(void)encodeWithCoder:(NSCoder *)aCoder;
  • 实现-(nullable instancetype)initWithCoder:(NSCoder *)aDecoder;

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject<NSCoding>

@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) NSInteger age;
@property (nonatomic,copy) NSString *sex;

@end

Peroson.m

#import "Person.h"

@implementation Person

//被归档的时候会调用者方法,aCoder就是归档时传过来的归档对象
- (void)encodeWithCoder:(NSCoder *)aCoder{

     [aCoder encodeObject:self.name forKey:@"name"];
     [aCoder encodeInteger:self.age forKey:@"age"];
     [aCoder encodeObject:self.sex forKey:@"sex"];
}

//解归档的时候会调用这个方法
- (instancetype)initWithCoder:(NSCoder *)aDecoder{

//解归档时会产生一个Person对象,这里是给这个Person对象赋值。
   self = [super init];
   if (self) {
       self.name = [aDecoder decodeObjectForKey:@"name"];
       self.age = [aDecoder decodeIntegerForKey:@"age"];
       self.sex = [aDecoder decodeObjectForKey:@"sex"];
            }
      return self;
   }
@end

同时将多个的对象归档与解归档

iOS开发-归档_第3张图片

你可能感兴趣的:(ios)