这里只讨论自定义类的归档解档问题
Teacher.h:
@interface Teacher : NSObject <NSCoding,NSSecureCoding>
//需要遵守这两个协议
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@end
Teacher.m:
//归档
- (void)encodeWithCoder:(nonnull NSCoder *)coder {
[coder encodeInt:self.age forKey:@"age"];
[coder encodeObject:self.name forKey:@"name"];
}
//解档
- (nullable instancetype)initWithCoder:(nonnull NSCoder *)coder {
if(self = [super init]){
self.age = [coder decodeIntForKey:@"age"];
self.name = [coder decodeObjectForKey:@"name"];
}
return self;
}
//必不可少
+ (BOOL)supportsSecureCoding{
return YES;
}
ViewController.m:
- (IBAction)save:(id)sender {
//获取tmp目录
NSString *tmpPath = NSTemporaryDirectory();
//获取file path
NSString *filePath = [tmpPath stringByAppendingPathComponent:@"teacher.arc"];
//后缀名不和常见类型撞上就行
//创建自定义对象
Teacher *t = [[Teacher alloc] init];
t.name = @"啊啊啊";
t.age = 29;
//归档
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:t requiringSecureCoding:NO error:nil];
[data writeToFile:filePath atomically:YES];
}
- (IBAction)read:(id)sender {
//获取tmp目录
NSString *tmpPath = NSTemporaryDirectory();
//获取file path
NSString *filePath = [tmpPath stringByAppendingPathComponent:@"teacher.arc"];
//后缀名不和常见类型撞上就行
//解档
NSData *data = [NSData dataWithContentsOfFile:filePath];
Teacher *t = [NSKeyedUnarchiver unarchivedObjectOfClass:[Teacher class] fromData:data error:nil];
NSLog(@"%d",t.age);
}
如果需要归档解档 包含自定义对象的数组时,注意更改:
- 归档:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.contacts requiringSecureCoding:NO error:nil];
这里面的contact是类的对象,contacts是由contact对象构成的数组
这样直接归档成为数组形式
- 解档:
self.contacts = (NSMutableArray *)[NSKeyedUnarchiver unarchivedArrayOfObjectsOfClass:[Contact class] fromData:data error:nil];
- 这里注意要使用:
+ (nullable NSArray *)unarchivedArrayOfObjectsOfClass:(Class)cls fromData:(NSData *)data error:(NSError **)error API_AVAILABLE(macos(11.0), ios(14.0), watchos(7.0), tvos(14.0)) NS_REFINED_FOR_SWIFT;
-- Objects是复数
-- 如果需要强转类型那就强转吧