Objective-C 类的归档与解档:NSCoding 协议实现对象持久化存储
在 Objective-C 中,归档(Archiving) 和 解档(Unarchiving) 是实现对象持久化存储的核心机制。通过遵循 NSCoding 协议,可将对象转换为二进制数据(归档),或从二进制数据重建对象(解档)。
一、核心协议:NSCoding
NSCoding 协议要求实现两个方法:
            
            
              objectivec
              
              
            
          
          @protocol NSCoding
- (void)encodeWithCoder:(NSCoder *)coder;  // 归档方法
- (nullable instancetype)initWithCoder:(NSCoder *)coder; // 解档方法
@end二、实现步骤
- 
声明遵循协议(.h 文件): objectivec#import <Foundation/Foundation.h> @interface Person : NSObject <NSCoding> @property (nonatomic, copy) NSString *name; @property (nonatomic, assign) NSInteger age; @end
- 
实现协议方法(.m 文件): objectivec@implementation Person // 归档:将属性编码为二进制数据 - (void)encodeWithCoder:(NSCoder *)coder { [coder encodeObject:self.name forKey:@"name"]; [coder encodeInteger:self.age forKey:@"age"]; } // 解档:从二进制数据重建对象 - (instancetype)initWithCoder:(NSCoder *)coder { self = [super init]; if (self) { _name = [coder decodeObjectForKey:@"name"]; _age = [coder decodeIntegerForKey:@"age"]; } return self; } @end
三、关键数据类型处理
| 数据类型 | 归档方法 | 解档方法 | 
|---|---|---|
| 对象类型(如 NSString) | encodeObject:forKey: | decodeObjectForKey: | 
| 基本类型(如 NSInteger) | encodeInteger:forKey: | decodeIntegerForKey: | 
| 浮点数(如 CGFloat) | encodeFloat:forKey: | decodeFloatForKey: | 
| 布尔值(BOOL) | encodeBool:forKey: | decodeBoolForKey: | 
| 结构体(如 CGRect) | encodeCGRect:forKey: | decodeCGRectForKey: | 
四、使用示例
- 
归档对象(保存到文件): objectivecPerson *person = [[Person alloc] init]; person.name = @"张三"; person.age = 30; // 获取存储路径 NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"person.data"]; // 归档并写入文件 [NSKeyedArchiver archiveRootObject:person toFile:path];
- 
解档对象(从文件读取): objectivecNSString *path = ... // 同上路径 Person *restoredPerson = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; NSLog(@"姓名: %@, 年龄: %ld", restoredPerson.name, (long)restoredPerson.age);
五、注意事项
- 键名一致性:归档和解档使用的键名必须完全一致
- 嵌套对象 :若属性是自定义对象,该对象也需实现 NSCoding
- 安全性扩展 :对于敏感数据,建议使用 NSSecureCoding(需实现+supportsSecureCoding方法)
- 性能优化:大量数据存储时,优先使用 Core Data 或 SQLite
六、应用场景
- 用户配置信息的本地保存
- 应用状态的持久化恢复
- 离线数据缓存
- 对象网络传输(需序列化)
通过 NSCoding 协议,开发者可以高效实现自定义对象的持久化存储,是 Objective-C 生态中数据本地化的基础解决方案。