Objective C 语言 使用NSCoder实现对象归档

Objective-C阿木 发布于 2025-06-29 8 次阅读


Objective-C 语言中的对象归档(Archiving)是一种将对象的状态保存到持久存储(如文件或数据库)的过程。NSCoder 是 Objective-C 中用于对象归档和反归档的标准类。本文将围绕 NSCoder 实现对象归档这一主题,通过一系列示例代码,详细介绍如何在 Objective-C 中使用 NSCoder 进行对象的归档和反归档。

在 Objective-C 中,对象归档是一种重要的功能,它允许开发者将对象的状态保存到磁盘,以便在应用程序重启后恢复对象的状态。NSCoder 类提供了归档和反归档对象的方法,使得对象的序列化和反序列化变得简单。

NSCoder 简介

NSCoder 是一个抽象类,它定义了归档和反归档对象所需的方法。NSCoder 有两个子类:NSKeyedArchiver 和 NSKeyedUnarchiver。这两个子类提供了键值编码(Key-Value Coding)的支持,使得对象的属性可以通过键值对的形式进行归档和反归档。

对象归档的基本步骤

1. 创建 NSCoder 对象。

2. 使用 NSCoder 的方法将对象的状态写入归档。

3. 将归档写入文件或其他持久存储。

示例代码

以下是一个简单的示例,展示如何使用 NSCoder 对象归档一个自定义对象。

objective-c

import <Foundation/Foundation.h>

@interface Person : NSObject


@property (nonatomic, strong) NSString name;


@property (nonatomic, strong) NSString address;


@end

@implementation Person

- (instancetype)initWithName:(NSString )name address:(NSString )address {


self = [super init];


if (self) {


_name = name;


_address = address;


}


return self;


}

- (void)encodeWithCoder:(NSCoder )aCoder {


[aCoder encodeObject:self.name forKey:@"name"];


[aCoder encodeObject:self.address forKey:@"address"];


}

@end

int main(int argc, const char argv[]) {


@autoreleasepool {


// 创建 Person 对象


Person person = [[Person alloc] initWithName:@"John Doe" address:@"123 Main St"];



// 创建 NSCoder 对象


NSKeyedArchiver archiver = [NSKeyedArchiver archivedDataWithRootObject:person];



// 将归档写入文件


[archiver writeToFile:@"person.archiver" atomically:YES];



// 释放 NSCoder 对象


[archiver release];


}


return 0;


}


对象反归档

反归档是将归档的数据恢复为对象的过程。以下是如何从文件中读取归档并恢复 Person 对象的示例代码。

objective-c

int main(int argc, const char argv[]) {


@autoreleasepool {


// 从文件中读取归档


NSKeyedUnarchiver unarchiver = [NSKeyedUnarchiver unarchiveObjectWithFile:@"person.archiver"];



// 获取 Person 对象


Person person = unarchiver.outputObject;



// 输出 Person 对象的属性


NSLog(@"Name: %@", person.name);


NSLog(@"Address: %@", person.address);



// 释放 NSCoder 对象


[unarchiver release];


}


return 0;


}


注意事项

1. 在归档对象之前,确保对象的所有属性都已经初始化。

2. 使用 NSCoder 的方法 encodeObject:forKey: 将对象属性写入归档。

3. 在反归档时,确保文件路径正确,并且文件存在。

4. 在归档和反归档过程中,不要手动管理 NSCoder 对象的内存,因为 NSCoder 对象通常由 Foundation 框架自动管理。

总结

使用 NSCoder 进行对象归档是 Objective-C 中实现对象持久化的一种有效方法。通过理解 NSCoder 的基本原理和使用方法,开发者可以轻松地将对象的状态保存到持久存储,并在需要时恢复对象的状态。本文通过示例代码展示了如何使用 NSCoder 进行对象的归档和反归档,希望对读者有所帮助。