欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-01-14 22:33:10
...
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