首先我们创建一个model类, 然后重写coder、encode。
只是为了保存这个model而已。
你也可以把dictionary等进行保存都是可以的。
@interface MMModel : NSObject<NSCoding>
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, copy) NSString *name1;
@property (nonatomic, copy) NSString *name2;
@property (nonatomic, copy) NSString *name3;
@end
#import "MMModel.h"
#import <objc/runtime.h>
@implementation MMModel
- (void)encodeWithCoder:(NSCoder *)encoder {
unsigned int count = 0;
// 利用runtime获取实例变量的列表
Ivar *ivars = class_copyIvarList([self class], &count);
for (int i = 0; i < count; i ++) {
// 取出i位置对应的实例变量
Ivar ivar = ivars[i];
// 查看实例变量的名字
const char *name = ivar_getName(ivar);
// C语言字符串转化为NSString
NSString *nameStr = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];
// 利用KVC取出属性对应的值
id value = [self valueForKey:nameStr];
// 归档
[encoder encodeObject:value forKey:nameStr];
}
// 记住C语言中copy出来的要进行释放
free(ivars);
}
- (id)initWithCoder:(NSCoder *)decoder {
if (self = [super init]) {
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([self class], &count);
for (int i = 0; i < count; i ++) {
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
//
NSString *key = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];
id value = [decoder decodeObjectForKey:key];
// 设置到成员变量身上
[self setValue:value forKey:key];
}
free(ivars);
}
return self;
}
@end
新创建一个对象
MMModel *model = [[MMModel alloc] init];
model.age = 12;
model.name1 = @"张三";
model.name2 = @"李四";
model.name3 = @"王五";
然后我们进行归档操作
//创建路径
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)lastObject];
NSLog(@"documents路径:%@",documentPath);
NSString *filePath = [documentPath stringByAppendingPathComponent:@"MMModel.data"];
//存储用户信息,归档
BOOL result = [NSKeyedArchiver archiveRootObject:model toFile:filePath];
if (result) {
NSLog(@"归档成功:%@",filePath);
}else{
NSLog(@"归档失败");
}
然后解档操作
//解档
MMModel *mm = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%ld",(long)mm.age);
NSLog(@"%@",mm.name1);
NSLog(@"%@",mm.name2);