返回

Xcode plist 文件归档解档问题

IOS

导言

在 iOS 开发中,plist(属性列表)文件是一种广泛用于存储应用程序设置、配置和数据的二进制文件格式。归档和解档过程涉及将对象转换为可存储或传输的二进制表示,然后在需要时将其转换回其原始形式。

自定义类的处理

当 plist 文件包含自定义类时,需要特殊处理以确保正确归档和解档。

归档自定义类

为了将自定义类归档到 plist 文件中,必须实现 NSCoding 协议。该协议定义了 encodeWithCoder:initWithCoder: 方法,负责将对象的状态编码为二进制表示并从二进制表示中初始化对象。

在自定义类中,覆盖 encodeWithCoder: 方法以编码对象的属性,并覆盖 initWithCoder: 方法以使用解码后的数据初始化对象。例如:

@interface Teacher : NSObject <NSCoding>

@property (nonatomic) NSString *name;
@property (nonatomic) NSInteger age;

- (instancetype)initWithCoder:(NSCoder *)aDecoder;
- (void)encodeWithCoder:(NSCoder *)aCoder;

@end

实现归档方法:

- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeInteger:self.age forKey:@"age"];
}

实现解档方法:

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    self = [super init];
    if (self) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.age = [aDecoder decodeIntegerForKey:@"age"];
    }
    return self;
}

解档自定义类

要从 plist 文件中解档自定义类,需要使用 NSKeyedUnarchiver 类。该类提供 unarchiveObjectWithFile: 方法,从指定的文件路径读取归档对象。

在解档过程中,自定义类需要实现 NSCoding 协议以允许对象从二进制表示中初始化。例如:

Teacher *teacher = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

处理包含自定义类的数组

如果 plist 文件包含一个包含自定义类的数组,则需要在归档和解档过程中进行一些额外的处理。

归档包含自定义类的数组

要归档包含自定义类的数组,请使用 NSKeyedArchiver 类的 encodeObject: 方法。该方法将数组中的每个对象编码为单独的归档对象。例如:

NSArray *teachers = @[teacher1, teacher2];
[NSKeyedArchiver archiveRootObject:teachers toFile:filePath];

解档包含自定义类的数组

要从 plist 文件中解档包含自定义类的数组,请使用 NSKeyedUnarchiver 类的 decodeObjectForKey: 方法。该方法使用指定键从解档对象中获取数组。例如:

NSArray *teachers = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath][@"teachers"];

结论

通过实现 NSCoding 协议和正确处理包含自定义类的数组,可以有效地归档和解档包含自定义类的 plist 文件。这对于在 iOS 应用中存储和检索复杂数据结构至关重要。