ios -归档自定义对象

要归档自定义对象,自定义类要遵守NSCoding协议 
NSCoding协议有2个方法:
encodeWithCoder:

每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量,可以使用encodeObject:forKey:方法归档实例变量

initWithCoder:

每次从文件中恢复(解码)对象时,都会调用这个方法。一般在这个方法里面指定如何解码文件中的数据为对象的实例变量,可以使用decodeObject:forKey方法解码实例变量。

.h文件,自定义的Person类,类中有自定义Dog类。

1 @class ZYDog;
2 // 如果想将一个自定义对象保存到文件中必须实现NSCoding协议
3 @interface Person : NSObject <NSCoding>
4 @property (strong,nonatomic) Dog *dog;
5 
6 @property (nonatomic, copy) NSString *name;
7 @property (nonatomic, assign) int age;
8 @property (nonatomic, assign) double height;
9 @end

.m文件

 1 // 当将一个自定义对象保存到文件的时候就会调用该方法
 2 // 在该方法中说明如何存储自定义对象的属性
 3 // 也就说在该方法中说清楚存储自定义对象的哪些属性
 4 - (void)encodeWithCoder:(NSCoder *)encoder
 5 {
 7     [encoder encodeObject:self.name forKey:@"name"];
 8     [encoder encodeInteger:self.age forKey:@"age"];
 9     [encoder encodeFloat:self.height forKey:@"heigth"];
10     [encoder encodeObject:self.dog forKey:@"dog"];
11 }
12 
13 // 当从文件中读取一个对象的时候就会调用该方法
14 // 在该方法中说明如何读取保存在文件中的对象
15 // 也就是说在该方法中说清楚怎么读取文件中的对象
16 - (id)initWithCoder:(NSCoder *)decoder
17 {
18         if (self = [super init]) {
19         self.name = [decoder decodeObjectForKey:@"name"];
20         self.age = [decoder decodeIntegerForKey:@"age"];
21         self.height = [decoder decodeFloatForKey:@"heigth"];
22         self.dog = [decoder decodeObjectForKey:@"dog"];
23     }
24     return self;
25 }

控制器中代码:向文件写入

 1 // 创建Person对象 
 2 Person *p = [[Person alloc] init];
 3     p.name = @"张山";
 4     p.age = 23;
 5     p.height = 126;
 6 
 7     // 创建dog
 8     NJDog *dog = [[NJDog alloc]init];
 9     dog.name = @"汪星人";
10     //
11     p.dog = dog;
12 
13  // 2.获取文件路径
14     NSString *docPath =  [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
15     NSString *path = [docPath stringByAppendingPathComponent:@"p.oo"];
16 
17    // 3.将自定义对象保存到文件中
18     [NSKeyedArchiver archiveRootObject:p toFile:path];
 // 1.获取文件路径
    NSString *docPath =  [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *path = [docPath stringByAppendingPathComponent:@"p.oo"];

    // 2.从文件中读取对象
    Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

注意:

如果父类也遵守了NSCoding协议,请注意:应该在encodeWithCoder:方法中加上一句[super encodeWithCode:encode];确保继承的实例变量也能被编码,即也能被归档应该在initWithCoder:方法中加上一句self = [super initWithCoder:decoder];确保继承的实例变量也能被解码,即也能被恢复。

 

posted @ 2014-06-11 22:48  delegate  阅读(170)  评论(0)    收藏  举报