复杂对象的写入文件
自己创建出来的类(例如 Student类)
写入的核心思想:
把复杂对象 转化成 简单对象 进行写入
一般转化成 NSData对象进行写入
-----------------------------------------------------------------------
Student.h
@interface Student : NSObject<NSCoding>
/*
复杂对象写入步骤:
1.遵守 NSCoding(需要在写入的时候 按照一定的规则进行写入 一定的编码格式去写入)归档与反归档(序列与反序列)
2.重写(协议中) 归档 与 反归档方法
3.创建一个复杂对象出来
4.创建一个归档对象
5.利用归档对象 把复杂对象 转化成Data
6.把data写入文件 进行数据持久化
*/
@property (nonatomic,retain)NSString *name;
@property (nonatomic,assign)NSInteger age;
@property (nonatomic,retain)NSData *imageData;
-----------------------------------------------------------------------
Student.m
@implementation Student
- (void)dealloc
{
[_name release];
[_imageData release];
[super dealloc];
}
归档方法
- (void)encodeWithCoder:(NSCoder *)aCoder
{
//按照一定编码格式归档
//注意:归档时候的key 要与 反归档时的key一致
[aCoder encodeObject:self.name forKey:@"name"];
//要选用 与属性一致的 编码方法
[aCoder encodeInteger:self.age forKey:@"age"];
//一般统一使用对象类型的
[aCoder encodeObject:self.imageData forKey:@"imageData"];
}
//反归档方法
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
//按照一定的编码格式 和存储的key标识 取出被归档的对象(反归档)
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
- (void)dealloc
{
[_name release];
[_imageData release];
[super dealloc];
}
归档方法
- (void)encodeWithCoder:(NSCoder *)aCoder
{
//按照一定编码格式归档
//注意:归档时候的key 要与 反归档时的key一致
[aCoder encodeObject:self.name forKey:@"name"];
//要选用 与属性一致的 编码方法
[aCoder encodeInteger:self.age forKey:@"age"];
//一般统一使用对象类型的
[aCoder encodeObject:self.imageData forKey:@"imageData"];
}
//反归档方法
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
//按照一定的编码格式 和存储的key标识 取出被归档的对象(反归档)
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
self.imageData = [aDecoder decodeObjectForKey:@"imageData"];
}
return self;
}
@end
-----------------------------------------------------------------------
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//复杂对象的写入文件
//自己创建出来的类(例如 Student类)
//写入的核心思想:
//把复杂对象 转化成 简单对象 进行写入
//一般转化成 NSData对象进行写入
//创建复杂对象
[super viewDidLoad];
// Do any additional setup after loading the view.
//复杂对象的写入文件
//自己创建出来的类(例如 Student类)
//写入的核心思想:
//把复杂对象 转化成 简单对象 进行写入
//一般转化成 NSData对象进行写入
//创建复杂对象
Student *stu= [[Student alloc] init];
复杂对象赋值
stu.name = @"张三";
stu.age = 23;
stu.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"32.jpg"]);
stu.age = 23;
stu.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"32.jpg"]);
NSMutableData *data = [NSMutableData data];(这时只是初始化 里面还没有值)
创建一个归档对象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
将复杂对象 通过归档对象 转化成data
[archiver encodeObject:stu forKey:@"student"];
完成归档
[archiver finishEncoding];(这一步必须要写)
实际上 通过归档对象 把复杂对象 写入data中
并且写入的标识 就key
注意:
归档与反归档 不是数据持久化
只是把复杂对象 按照系统编码格式 转化成data
真正数据持久化 还是写入文件
NSLog(@"%@",data);(data里面已经有值)
获取路径
NSString *documentpath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSLog(@"%@",documentpath);
拼接路径
NSString *path = [documentpath stringByAppendingPathComponent:@"/SaveStudent"];
写入文件
[data writeToFile:path atomically:YES];
释放归档对象
[archiver release];
[data writeToFile:path atomically:YES];
释放归档对象
[archiver release];
-----------------------------------------------------------------------
//反归档
//从沙盒中读取data数据
NSData *dataNew = [NSData dataWithContentsOfFile:path];
//创建反归档对象(利用data创建)
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc ] initForReadingWithData:dataNew];
//利用反归档对象 反归档出复杂对象
Student *student = [unarchiver decodeObjectForKey:@"student"];
//调用完成 返回归档
[unarchiver finishDecoding];
UIImage *image = [UIImage imageWithData:student.imageData];
//如何把一个数组的 复杂对象 写到文件中
//遍历这个数组 把每一个复杂对象 转化成简单对象(data) 然后 再将data保存到数组中
//最后 直接把数组写入文件中 进行持久化
}
//从沙盒中读取data数据
NSData *dataNew = [NSData dataWithContentsOfFile:path];
//创建反归档对象(利用data创建)
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc ] initForReadingWithData:dataNew];
//利用反归档对象 反归档出复杂对象
Student *student = [unarchiver decodeObjectForKey:@"student"];
//调用完成 返回归档
[unarchiver finishDecoding];
UIImage *image = [UIImage imageWithData:student.imageData];
//如何把一个数组的 复杂对象 写到文件中
//遍历这个数组 把每一个复杂对象 转化成简单对象(data) 然后 再将data保存到数组中
//最后 直接把数组写入文件中 进行持久化
}