OC单个对象的归档和解归档
FJIdol.h
#import <Foundation/Foundation.h>
//遵守NSCoding协议:需要实现协议方法
@interface FJIdol : NSObject <NSCoding>
@property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) NSString *sex;
//CGFloat OC中的浮点型
//NSInteger 整型(32)/长整型(64)
//NSUInteger 无符号的整型/长整型
@property (nonatomic,assign) CGFloat score;
@property (nonatomic,assign) NSInteger face;
- (instancetype) initWithName:(NSString *)name
sex:(NSString *)sex
score:(CGFloat) score
face:(NSInteger) face;
@end
FJIdol.m
#import "FJIdol.h"
@implementation FJIdol
//归档:将当前类中需要归档的属性归档(就是将数据存储到本地)
//aCoder归档对象(就是专门用来对属性进行归档);
- (void)encodeWithCoder:(NSCoder *)aCoder{
//用来归档对象的方法
// - (void)encodeObject:(id)objv forKey:(NSString *)key;
//注意归档方法和需要归档的属性的类型要匹配;
//归档姓名
[aCoder encodeObject:_name forKey:@"name"];
//归档性别
[aCoder encodeObject:_sex forKey:@"sex"];
//归档分数
[aCoder encodeFloat:_score forKey:@"score"];
//归档颜值
[aCoder encodeInteger:_face forKey:@"face"];
}
//解归档的协议方法;
//将类中的已经归档的属性解归档出来;
- (id)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
//注意:
//1.对于同一个属性来说,使用什么样的方式将属性归档,就需要使用相同的方式解归档
//2.归档和解归档的key值要一致
//3.赋值也一定要有!!
//解归档姓名
_name = [aDecoder decodeObjectForKey:@"name"];
//解归档性别
_sex = [aDecoder decodeObjectForKey:@"sex"];
//解归档分数
_score = [aDecoder decodeFloatForKey:@"score"];
//解归档颜值
_face = [aDecoder decodeIntegerForKey:@"face"];
}
return self;
}
- (instancetype)initWithName:(NSString *)name sex:(NSString *)sex score:(CGFloat)score face:(NSInteger)face{
if ( self = [super init]) {
_name = name;
_sex = sex;
_score =score;
_face = face;
}
return self;
}
- (NSString *)description{
return [NSString stringWithFormat:@"%@ %@ %f %lu",
_name,_sex,_score,_face];
}
@end
main.m
//归档的目的:将自己的类的对象存储到本地
//归档的步骤
//1.创建自己的类;
//2.让需要归档的类遵守NSCoding的协议.
//在需要归档的类的.m文件中实现NSCoding协议方法
//3.在合适的地方将自己的类的对象进行归档
//a.创建一个对象
//b.创建一个归档工具NSKeyedArchiver
//c.使用归档工具对对象进行归档
//d.结束归档;
//e.将数据写入本地文件中
//并不是所有的类都可以进行归档,类的对象可以进行归档和
//解归档的前提是遵守NSCoding协议,Z
#import <Foundation/Foundation.h>
#import "FJIdol.h"
#define path @"/Users/IOS1601/Desktop/plist文件/idolData"
//归档
void achiver();
//解归档
void deAchiver();
int main(int argc, const char * argv[]) {
@autoreleasepool {
deAchiver();
}
return 0;
}
#pragma mark 归档
void achiver(){
//1.创建一个对象
FJIdol *idol = [[FJIdol alloc] initWithName:@"鹿晗"
sex:@"男" score:100 face:100];
//2.创建一个归档工具
//参数:一个可变的二进制对象
NSMutableData *mdata = [[NSMutableData alloc] init];
NSKeyedArchiver *achiver = [[NSKeyedArchiver alloc]
initForWritingWithMutableData:mdata];
//3.使用归档工具对对象进行归档
//achiver调用当前方法的时候,会自动去调用类中的协议方法;
//将idol的属性归档;方法调用结束后,idol的数据会存到mdata中
[achiver encodeObject:idol forKey:@"idol"];
//4.关闭归档工具
[achiver finishEncoding];
//5.将数据写入本地文件中
[mdata writeToFile:path atomically:NO];
}
#pragma mark 解归档
//先去实现解归档的对象的类的NSCoding协议方法的解归档方法
void deAchiver(){
//1.创建一个NSData去获取归档保存的二进制文件里面的内容;
NSData *data = [[NSData alloc] initWithContentsOfFile:path];
//2.创建一个解归档工具
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]
initForReadingWithData:data];
//3.解归档
//注意:解归档和归档时候方式和key值一致
//在这里也会自动去调用NSCoding中解归档相关的协议方法;
FJIdol *idol = [unarchiver decodeObjectForKey:@"idol"];
[unarchiver finishDecoding];
NSLog(@"%@",idol);
}
转载于:https://my.oschina.net/luhoney/blog/650072