1、在iOS开发中,对象的归档存储是最为常用一种操作,我们经常需要将对象保存到本地,后续再从本地读取调用,比如说游戏中的存档操作。
2、常规类型如字符串、数组、字典、图片等对象的归档系统都有对应的方法,使得归档变得简单,那么自定义的对象如何归档呢?
3、实现原理与常规类型归档类似,唯一不同的是自定义对象如果需要归档则必须遵守
1 2 3 4 | #pragma mark 自定义对象解档必须实现方法 - (id)initWithCoder:(NSCoder *)aDecoder #pragma mark 自定义对象归档必须实现方法 - (void)encodeWithCoder:(NSCoder *)aCoder |
4、举例说明,现自定义一个Person类,成员变量有name、age、phone,现需要对该对象进行归档,对象该如何写:
4.1、Person.h
1 2 3 4 5 6 7 8 9 10 11 12 13 | #import <foundation /Foundation.h> @interface Person : NSObject <nscoding> @property (nonatomic, strong) NSString *name; @property (nonatomic, assign) NSInteger age; @property (nonatomic, strong) NSString *phone; - (id)initWithName:(NSString *)name age:(NSInteger)age phone:(NSString *)phone; @end</nscoding></foundation> |
4.2、Person.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #import "Person.h" @implementation Person #pragma mark 工厂化初始方法 - (id)initWithName:(NSString *)name age:(NSInteger)age phone:(NSString *)phone { if (self = [super init]){ _name = name; _age = age; _phone = phone; } return self; } #pragma mark 自定义对象解档必须实现方法 - (id)initWithCoder:(NSCoder *)aDecoder { // init方法正规写法,如果父类实现了initWithCode:方法,则写成if (self = [super initWithCode:aDecode]){ if (self = [super init]) { // 各成员变量解档规划,各key是由归档时自定义的 self.name = [aDecoder decodeObjectForKey:@"name"]; self.age = [[aDecoder decodeObjectForKey:@"age"] integerValue]; self.phone = [aDecoder decodeObjectForKey:@"phone"]; } return self; } #pragma mark 自定义对象归档必须实现方法 - (void)encodeWithCoder:(NSCoder *)aCoder { // 自定义各成员变量归档规则,即自定义各key,与解档时相对应 [aCoder encodeObject:self.name forKey:@"name"]; [aCoder encodeObject:@(self.age) forKey:@"age"]; [aCoder encodeObject:self.phone forKey:@"phone"]; } @end |
5、相当链接
5.1、iOS开发中基本文件读写操作示例
5.2、iOS开发中多对象归档操作
Pingback: iOS开发中多对象归档操作 | 小龙虾博客 (Crayfish)
Pingback: iOS开发中基本文件读写操作示例 | 小龙虾博客 (Crayfish)