xcode plist文件归档解档问题

1,087 阅读1分钟

这里只讨论自定义类的归档解档问题

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是复数

-- 如果需要强转类型那就强转吧