NSKeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法.前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码
1.先定义一个Person类
Person.h文件中
@interface Person : NSObject<NSCoding>
@property (nonatomic, assign) NSInteger pId;
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, strong) NSString *sex;
@property (nonatomic, assign) CGFloat height;
/**保存路径*/
+ (NSString *)personPath;
@end
Person.m文件中
// 当将一个自定义对象保存到文件的时候就会调用该方法
// 在该方法中说明如何存储自定义对象的属性
// 也就说在该方法中说清楚存储自定义对象的哪些属性
/**协议方法-对数据进行序列化*/
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:@(self.pId) forKey:@"person_id"];
[aCoder encodeObject:self.name forKey:@"person_name"];
[aCoder encodeObject:@(self.age) forKey:@"person_age"];
[aCoder encodeObject:self.sex forKey:@"person_sex"];
[aCoder encodeObject:@(self.height) forKey:@"person_height"];
}
// 当从文件中读取一个对象的时候就会调用该方法
// 在该方法中说明如何读取保存在文件中的对象
// 也就是说在该方法中说清楚怎么读取文件中的对象
/**协议方法-对数据进行反序列化并读取*/
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super init]) {
self.pId = [[aDecoder decodeObjectForKey:@"person_id"] integerValue];
self.name = [aDecoder decodeObjectForKey:@"person_name"];
self.age = [[aDecoder decodeObjectForKey:@"person_age"] integerValue];
self.sex = [aDecoder decodeObjectForKey:@"person_sex"];
self.height = [[aDecoder decodeObjectForKey:@"person_height"] floatValue];
}
return self;
}
#pragma mark - 保存路劲
+ (NSString *)personPath
{
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *path = [docPath stringByAppendingPathComponent:@"person"];
return path;
}
2.归档操作:
如果对Person对象归档保存,只需要调用NSCoder子类NSKeyedArchiver的方法archiveRootObject:toFile:即可
// 先定义Person对象
Person *person = [[Person alloc] init];
person.pId = 1;
person.name = @"Jack";
person.age = 23;
person.sex = @"男";
person.height = 187.0;
// 保存路劲
NSString *path = [Person personPath];
[NSKeyedArchiver archiveRootObject:person toFile:path];
3.解压操作:
如果对Person对象解压操作,只需要调用NSCoder子类NSKeyedUnarchiver的方法unarchiveRootObject:toFile:即可
NSString *path = [Person personPath]; // 根据路劲解压数据
[NSKeyedUnarchiver unarchiveObjectWithFile:path];
4.删除数据:
NSString *path = [Person personPath]; // 根据路劲删除数据
[[NSFileManager defaultManager] removeItemAtPath:path error:nil];
5.特点:
1)易用性较强
2)数据存储archive文件中
3)一般用于存储少量数据
6.缺点:
归档的形式来保存数据,只能一次性归档保存以及一次性解压.所以只能针对小量数据,而且对数据操作比较笨拙,即如果想改动数据的某一小部分,还是需要解压整个数据或者归档整个数据.