您的位置:首页 > 其它

OC单个对象的归档和解归档

2016-03-30 00:00 127 查看
摘要: 设计一个类,生成本地文件并解析出来

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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息