归档,josn,plist,xml,数据库是数据存储的几种重要的形式,其中归档是存储对象的方式,存储对象分为
两种,一种是系统对象的存储,另一种是自定义对象的存储,系统对象存储比较简单。直接调用系统给的方法
不需要重写系统对象的方法,但是自定义对象的归档需要去重写对象的两个方法,让系统知道你有那些数据是
需要归档的,那些数据是要解档。 我们这里创建一个Dog类 ,以它里面的成员归档为例。
Dog类:
#import
//使用协议
//1.遵守指定的协议,规定对象如何编码NSCoding叫做编码协议
//2实现协议中的方法.
@interface Dog : NSObject <NSCoding>
@property NSString * nickname;
@property NSString *gender; //性别
@property float weight;
@property NSString *type;
@end
#import "Dog.h"
@implementation Dog
//重写nsobject类的description的方法,打印对象
-(NSString*)description
{
//将对象转化后打印对象.
return [NSString stringWithFormat:@"%@%@%f@%@",_nickname,_gender,_weight,_type];
}
//注意。自定义对象的归档必须去重写encodeWithCoder,initWithCoder的两个方法。系统对象不需要的
//如果是自定义对象,必须实现重载encodeWithCoder,initWithCoder的两个方法告诉系统,你的对象里面到底有那些数据。
/ /- (void)encodeWithCoder:(NSCoder *)aCoder
//- (id)initWithCoder:(NSCoder *)aDecoder
//1.归档
- (void)encodeWithCoder:(NSCoder *)aCoder
{//告诉系统应该怎么样去编码,如果没有加这个方法,自定义对象归档会崩溃
//把类中的对象指定一个key,编码到文件中
[aCoder encodeObject:self.nickname forKey:@"nickname"];
[aCoder encodeObject:self.gender forKey:@"gender"];
[aCoder encodeObject:[NSNumber numberWithFloat:self.weight] forKey:@"weight"];
[aCoder encodeObject:self.type forKey:@"type"];
}
//2.解档
- (id)initWithCoder:(NSCoder *)aDecoder
{//告诉系统应该怎么样去解码,如果没有加这个方法,自定义对象归档回崩溃
//
if(self=[super init])
{
//对数据进行解码
self.nickname=[aDecoder decodeObjectForKey:@"nickname"];
self.gender=[aDecoder decodeObjectForKey:@"gender"];
self.weight=[[aDecoder decodeObjectForKey:@"weight"]floatValue ];
self.type=[aDecoder decodeObjectForKey:@"type"];
}
return self;
}
@end
#import
#import "Dog.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
一.系统对象的归档
//1.1系统对象的归档
作用是把一个对象保存到文件中
//相比plist:plist 只能存储简单数据类型,不能存储对象的复杂数据类型,归档可以存储复杂数据类型
NSString *array=[[NSArray alloc]initWithObjects:@"小二",@"三少",@"四娘",@"跳舞大神", nil];
//通过归档的形势存储到文件中
//设置文件路径path
NSString *path=@"/Users/student/Desktop/people.data";
BOOL b= [NSKeyedArchiver archiveRootObject:array toFile:path];
NSLog(@"b=%i",b);
//1.2系统对象的解档
//解挡把对象文件恢复出来
//参数1:传入保存对象文件
//返回保存的对象
//原来存储的是什么类型,就用什么类型接受
NSArray *readarray=[NSKeyedUnarchiver unarchiveObjectWithFile:path];
for (NSString *str in readarray) {
NSLog(@"str=%@",str);
}
二 自定义对象的归档
//2.1自定义类的对象的归档和解档。要求必须重写父类的encodeWithCoder,initWithCoder这两个方法才可以实现归档和解档,否则系统无法知道你对象里面到底有什么样的数据,无法归档和解档,系统崩溃
Dog *huaer=[[Dog alloc]init];
huaer.nickname=@"huaer";
huaer.gender=@"gril";
huaer.weight=15;
huaer.type=@"土狗";
Dog *amiao=[[Dog alloc]init];
amiao.nickname=@"amiao";
amiao.gender=@"boy";
amiao.weight=60;
amiao.type=@"藏獒";
//2.1归档
//自定义的对象不能直接归档,直接归档回崩溃.
//需要告诉系统,对象应该如何归档.
//自己类中添加一些指定的方法
NSString *path=@"/Users/student/Desktop/dog.data";
[NSKeyedArchiver archiveRootObject:huaer toFile:path];
//NSLog(@"huaer=%@",huaer);
//2.2解档
Dog *newDog=[NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSLog(@"%@ \n %@ \n %f\n %@",newDog.nickname,newDog.gender,newDog.weight,newDog.type);
}
return 0;
}