iOS开发中自定义对象的归档

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开发中多对象归档操作

2 thoughts on “iOS开发中自定义对象的归档

  1. Pingback: iOS开发中多对象归档操作 | 小龙虾博客 (Crayfish)

  2. Pingback: iOS开发中基本文件读写操作示例 | 小龙虾博客 (Crayfish)

Leave a Reply