Objective C 语言 对象归档与解档

Objective-C阿木 发布于 19 天前 3 次阅读


Objective-C 语言的对象归档与解档是 iOS 和 macOS 开发中常见的需求,特别是在需要将对象状态保存到磁盘或通过网络传输时。归档(Archiving)是指将对象的状态序列化成一种持久化的形式,而解档(Unarchiving)则是将这种序列化的数据恢复成对象的状态。本文将围绕 Objective-C 的对象归档与解档技术,通过代码示例进行详细讲解。

在 Objective-C 中,对象归档与解档通常使用 `NSKeyedArchiver` 和 `NSKeyedUnarchiver` 类来实现。这两个类遵循了 `NSCoding` 协议,该协议定义了对象序列化和反序列化的方法。以下将详细介绍如何使用这些类进行对象归档与解档。

1. 定义一个可归档的类

我们需要定义一个遵循 `NSCoding` 协议的类。这意味着该类必须实现 `encodeWithCoder:` 和 `initWithCoder:` 方法。

objc

@interface Person : NSObject <NSCoding>

@property (nonatomic, strong) NSString name;


@property (nonatomic, strong) NSString email;

- (instancetype)initWithName:(NSString )name email:(NSString )email;


- (void)encodeWithCoder:(NSCoder )aCoder;

@end

@implementation Person

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


self = [super init];


if (self) {


_name = name;


_email = email;


}


return self;


}

- (void)encodeWithCoder:(NSCoder )aCoder {


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


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


}

- (instancetype)initWithCoder:(NSCoder )aCoder {


NSString name = [aCoder decodeObjectForKey:@"name"];


NSString email = [aCoder decodeObjectForKey:@"email"];


return [[self class] initWithName:name email:email];


}

@end


2. 归档对象

使用 `NSKeyedArchiver` 类可以将对象归档到文件或数据流中。以下是一个将 `Person` 对象归档到文件中的示例:

objc

Person person = [[Person alloc] initWithName:@"John Doe" email:@"john.doe@example.com"];


NSKeyedArchiver archiver = [[NSKeyedArchiver alloc] init];


[archiver archiveObject:person toFile:@"person.archiver"];


[archiver finishArchiving];


3. 解档对象

解档对象与归档过程类似,但使用 `NSKeyedUnarchiver` 类。以下是从文件中解档 `Person` 对象的示例:

objc

NSKeyedUnarchiver unarchiver = [[NSKeyedUnarchiver alloc] init];


Person person = [unarchiver decodeObjectWithFile:@"person.archiver"];


[unarchiver finishUnarchiving];


4. 使用归档与解档

在实际应用中,我们可能需要在不同的场景下进行归档和解档。以下是一个简单的示例,展示如何在应用程序中保存和恢复用户数据:

objc

// 保存用户数据


NSUserDefaults defaults = [NSUserDefaults standardUserDefaults];


[defaults setObject:person forKey:@"person"];


[defaults synchronize];

// 恢复用户数据


NSUserDefaults defaults = [NSUserDefaults standardUserDefaults];


Person person = [defaults objectForKey:@"person"];


5. 注意事项

- 在归档和解档过程中,遵循 `NSCoding` 协议的类必须实现 `encodeWithCoder:` 和 `initWithCoder:` 方法。

- 不要在归档和解档过程中直接修改对象属性,因为这可能会导致数据不一致。

- 在归档和解档过程中,确保所有属性都是可序列化的,否则可能会遇到错误。

总结

Objective-C 的对象归档与解档是 iOS 和 macOS 开发中重要的技术。通过使用 `NSCoding` 协议和 `NSKeyedArchiver`/`NSKeyedUnarchiver` 类,我们可以轻松地将对象状态保存到磁盘或通过网络传输。本文通过代码示例详细介绍了如何实现对象归档与解档,并提供了实际应用中的使用场景。希望这些信息能帮助您更好地理解和应用 Objective-C 的对象归档与解档技术。