Objective-C基础:自定义对象归档详解及简单实例
1. 什么是归档?
归档是将对象保存到文件中,以便以后可以恢复对象时使用的一种技术。在iOS开发中,归档通常用于将自定义对象保存到本地,如用户数据、游戏进度等。
2. 归档的分类
归档分为两种:文件归档和系统归档。
- 文件归档:将对象保存到指定的文件中。
- 系统归档:将对象保存到系统的偏好设置、键值存储、Core Data等系统库中。
这里主要介绍文件归档。
3. 自定义对象的归档
3.1 实现NSCoding协议
首先需要让自定义对象实现NSCoding协议,该协议包含两个方法:
- (void)encodeWithCoder:(NSCoder *)encoder {
// encode
}
- (instancetype)initWithCoder:(NSCoder *)decoder {
// decode
}
编码方法(encodeWithCoder)负责将对象的各个属性转换成归档格式,存储到文件中。解码方法(initWithCoder)则可以根据归档格式从文件中恢复之前保存的对象属性。
具体实现示例如下:
@interface Person : NSObject <NSCoding>
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end
@implementation Person
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:self.name forKey:@"name"];
[encoder encodeInteger:self.age forKey:@"age"];
}
- (instancetype)initWithCoder:(NSCoder *)decoder {
if (self = [super init]) {
self.name = [decoder decodeObjectForKey:@"name"];
self.age = [decoder decodeIntegerForKey:@"age"];
}
return self;
}
@end
3.2 归档和解档对象
归档对象需要使用NSKeyedArchiver类,解档对象需要使用NSKeyedUnarchiver类。
// 归档对象
Person *p = [[Person alloc] init];
p.name = @"Jack";
p.age = 20;
NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"person.data"];
BOOL success = [NSKeyedArchiver archiveRootObject:p toFile:filePath];
// 解档对象
Person *p1 = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
3.3 自定义对象嵌套
如果自定义对象中的属性也是自定义对象,则需要对子对象进行归档和解档。
例如,下面是一个包含自定义对象的Person类:
@interface Book : NSObject <NSCoding>
@property (nonatomic, strong) NSString *name;
@end
@implementation Book
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:self.name forKey:@"name"];
}
- (instancetype)initWithCoder:(NSCoder *)decoder {
if (self = [super init]) {
self.name = [decoder decodeObjectForKey:@"name"];
}
return self;
}
@end
@interface Person : NSObject <NSCoding>
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, strong) Book *book;
@end
@implementation Person
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:self.name forKey:@"name"];
[encoder encodeInteger:self.age forKey:@"age"];
[encoder encodeObject:self.book forKey:@"book"];
}
- (instancetype)initWithCoder:(NSCoder *)decoder {
if (self = [super init]) {
self.name = [decoder decodeObjectForKey:@"name"];
self.age = [decoder decodeIntegerForKey:@"age"];
self.book = [decoder decodeObjectForKey:@"book"];
}
return self;
}
@end
在归档和解档对象时,需要对子对象进行归档和解档:
// 归档对象
Person *p = [[Person alloc] init];
p.name = @"Jack";
p.age = 20;
Book *b = [[Book alloc] init];
b.name = @"iOS开发";
p.book = b;
NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"person.data"];
BOOL success = [NSKeyedArchiver archiveRootObject:p toFile:filePath];
// 解档对象
Person *p1 = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
4. 示例
下面给出一个具体的示例代码。
// 自定义对象
@interface Book : NSObject <NSCoding>
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger price;
@end
@implementation Book
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:self.name forKey:@"name"];
[encoder encodeInteger:self.price forKey:@"price"];
}
- (instancetype)initWithCoder:(NSCoder *)decoder {
if (self = [super init]) {
self.name = [decoder decodeObjectForKey:@"name"];
self.price = [decoder decodeIntegerForKey:@"price"];
}
return self;
}
@end
// 归档和解档对象
- (void)archiveObject {
// 归档
Book *book = [[Book alloc] init];
book.name = @"iOS开发指南";
book.price = 50;
NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"book.data"];
BOOL success = [NSKeyedArchiver archiveRootObject:book toFile:filePath];
// 解档
Book *book1 = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"book.name = %@, book.price = %ld", book1.name, (long)book1.price);
}
5. 总结
- 归档是将对象保存到文件中,以便以后可以恢复对象时使用的一种技术。
- 自定义对象需要实现NSCoding协议,包含两个方法:编码方法(encodeWithCoder)和解码方法(initWithCoder)。
- 归档和解档对象需要使用NSKeyedArchiver和NSKeyedUnarchiver类。
- 自定义对象嵌套时,需要对子对象进行归档和解档。
- 在iOS开发中,通常使用文件归档保存数据到本地。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Objective-C基础 自定义对象归档详解及简单实例 - Python技术站