Objective-C 类的归档与解档:NSCoding 协议实现对象持久化存储

Objective-C 类的归档与解档:NSCoding 协议实现对象持久化存储

在 Objective-C 中,归档(Archiving)解档(Unarchiving) 是实现对象持久化存储的核心机制。通过遵循 NSCoding 协议,可将对象转换为二进制数据(归档),或从二进制数据重建对象(解档)。

一、核心协议:NSCoding

NSCoding 协议要求实现两个方法:

objectivec 复制代码
@protocol NSCoding
- (void)encodeWithCoder:(NSCoder *)coder;  // 归档方法
- (nullable instancetype)initWithCoder:(NSCoder *)coder; // 解档方法
@end
二、实现步骤
  1. 声明遵循协议(.h 文件):

    objectivec 复制代码
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject <NSCoding>
    @property (nonatomic, copy) NSString *name;
    @property (nonatomic, assign) NSInteger age;
    @end
  2. 实现协议方法(.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:
四、使用示例
  1. 归档对象(保存到文件):

    objectivec 复制代码
    Person *person = [[Person alloc] init];
    person.name = @"张三";
    person.age = 30;
    
    // 获取存储路径
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"person.data"];
    
    // 归档并写入文件
    [NSKeyedArchiver archiveRootObject:person toFile:path];
  2. 解档对象(从文件读取):

    objectivec 复制代码
    NSString *path = ... // 同上路径
    Person *restoredPerson = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    NSLog(@"姓名: %@, 年龄: %ld", restoredPerson.name, (long)restoredPerson.age);
五、注意事项
  1. 键名一致性:归档和解档使用的键名必须完全一致
  2. 嵌套对象 :若属性是自定义对象,该对象也需实现 NSCoding
  3. 安全性扩展 :对于敏感数据,建议使用 NSSecureCoding(需实现 +supportsSecureCoding 方法)
  4. 性能优化:大量数据存储时,优先使用 Core Data 或 SQLite
六、应用场景
  • 用户配置信息的本地保存
  • 应用状态的持久化恢复
  • 离线数据缓存
  • 对象网络传输(需序列化)

通过 NSCoding 协议,开发者可以高效实现自定义对象的持久化存储,是 Objective-C 生态中数据本地化的基础解决方案。

相关推荐
2501_915909066 小时前
iOS 26 性能监控工具有哪些?多工具协同打造全方位性能分析体系
android·macos·ios·小程序·uni-app·cocoa·iphone
集成显卡6 小时前
Bun.js + Elysia 框架实现基于 SQLITE3 的简单 CURD 后端服务
开发语言·javascript·sqlite·bun.js
无敌最俊朗@6 小时前
SQlite:电影院售票系统中的主键(单列,复合)约束应用
java·开发语言·数据库
今日说"法"6 小时前
Rust 代码审查清单:从安全到性能的关键校验
开发语言·安全·rust
美狐美颜SDK开放平台7 小时前
美颜SDK跨平台适配实战解析:让AI美颜功能在iOS与Android都丝滑运行
android·人工智能·ios·美颜sdk·直播美颜sdk·第三方美颜sdk·美颜api
wydaicls7 小时前
C语言 了解一下回调函数(钩子函数)的使用
c语言·开发语言
java1234_小锋7 小时前
PyTorch2 Python深度学习 - 数据集与数据加载
开发语言·python·深度学习·pytorch2
千码君20167 小时前
Go语言:常量计数器iota的意义
开发语言·后端·golang·状态码·const·iota·常量
永远有缘7 小时前
四种编程语言常用函数对比表
java·开发语言·c++·python