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];确保继承的实例变量也能被解码,即也能被恢复。
com.nigo
浙公网安备 33010602011771号