自定义类Person.h
@interface PersonModel : NSObject <NSCoding>
/** * 复杂对象最持久化 需要遵守一个协议<NSCoding>
*/
@property (nonatomic, retain) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, retain) NSData *data;
@end
Person.m
#import "PersonModel.h"
@implementation PersonModel
-(void)dealloc
{
[_name release];
[_data release];
[super dealloc];
}
// 对复杂对象持久化叫做归档与反归档(编码与解码)
// 归档方法 编码成可以持久化的格式(归档时调用)
-(void)encodeWithCoder:(NSCoder *)aCoder
{
// 对每一个属性都要进行重新编码
// 注意:属性的类型
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
[aCoder encodeObject:self.data forKey:@"data"];
}
// 反归档方法 解码的过程(反归档时调用)
-(id)initWithCoder:(NSCoder *)aDecoder
{
//
self = [super init];
if (self) {
// 解码的过程
// 和编码一样 除了对象类型外也是有特殊解码方法
// 注意:编码时候给的key要和解码key一样
self.name = [aDecoder decodeObjectForKey:@"name"];
//注意类型
self.age = [aDecoder decodeIntegerForKey:@"age"];
self.data = [aDecoder decodeObjectForKey:@"data"];
}
return self;
}
-(void)setValue:(id)value forUndefinedKey:(NSString *)key
{
// KVC赋值保护方法
}
@end
实现归档与反归档代码:
#import "RootViewController.h"
#import "PersonModel.h"
#define kDocumentPath [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]
@implementation RootViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self archiver];
[self unArchiver];
}
// 复杂对象归档
- (void)archiver
{
// 初始化对象
PersonModel *model = [[PersonModel alloc] init];
// 赋值对象
model.name = @"悟空";
model.age = 500;
// 将 图片转化成data
// 把一个png格式的转化为data
model.data = UIImagePNGRepresentation([UIImage imageNamed:@"pic2"]);
// 创建一个可变data 初始化归档对象
NSMutableData *data = [NSMutableData data];
// 创建一个归档对象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
// 进行归档编码
[archiver encodeObject:model forKey:@"JJModel"]; //此时调用归档方法encodeWithCoder:
// 编码完成
[archiver finishEncoding];
// 实际上归档 相当于把编码完的对象 保存到data中
NSLog(@"%@", data);
// 把存有复杂对象的data写入文件中进行持久化
// 路径
NSString *dataPath = [kDocumentPath stringByAppendingPathComponent:@"JJModel.da"];
// 写入方法
[data writeToFile:dataPath atomically:YES];
// 释放归档对象
[archiver release];
NSLog(@"%@", dataPath);
}
// 反归档 解码的过程
- (void)unArchiver
{
// 创建反归档对象
// 获取刚才归档的data
NSString *dataPath = [kDocumentPath stringByAppendingPathComponent:@"JJModel.da"];
NSData *data = [NSData dataWithContentsOfFile:dataPath];
NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
// 解码返回一个对象
PersonModel *model = [unArchiver decodeObjectForKey:@"JJModel"]; // 此时调用反归档方法initWithCoder:
// 反归档完成
[unArchiver finishDecoding];
// 释放反归档对象
[unArchiver release];
UIImage *image = [UIImage imageWithData:model.data];
NSLog(@"%@", model);
}
@end