OC單個對象的歸檔和解歸檔

FJIdol.h


#import <Foundation/Foundation.h>工具


//遵照NSCoding協議:須要實現協議方法atom

@interface FJIdol : NSObject <NSCoding>spa


@property (nonatomic,copy) NSString *name;.net

@property (nonatomic,copy) NSString *sex;3d

//CGFloat OC中的浮點型code

//NSInteger 整型(32)/長整型(64)orm

//NSUInteger 無符號的整型/長整型對象

@property (nonatomic,assign) CGFloat score;ip

@property (nonatomic,assign) NSInteger face;get


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

    

    

    

}

相關文章
相關標籤/搜索