iOS 系統對象和自定義對象的歸檔Archiver

 

歸檔,josn,plist,xml,數據庫是數據存儲的幾種重要的形式,其中歸檔是存儲對象的方式,存儲對象分爲

兩種,一種是系統對象的存儲,另一種是自定義對象的存儲,系統對象存儲比較簡單。直接調用系統給的方法

不需要重寫系統對象的方法,但是自定義對象的歸檔需要去重寫對象的兩個方法,讓系統知道你有那些數據是

需要歸檔的,那些數據是要解檔。  我們這裏創建一個Dog類 ,以它裏面的成員歸檔爲例。

Dog類:

#import <Foundation/Foundation.h>

//使用協議

  //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.weightforKey:@"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 <Foundation/Foundation.h>

#import "Dog.h"

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

        

      一.系統對象的歸檔

         //1.1系統對象的歸檔

         作用是把一個對象保存到文件中

        //相比plistplist 只能存儲簡單數據類型,不能存儲對象的複雜數據類型,歸檔可以存儲複雜數據類型

        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自定義類的對象的歸檔和解檔。要求必須重寫父類的encodeWithCoderinitWithCoder這兩個方法纔可以實現歸檔和解檔,否則系統無法知道你對象裏面到底有什麼樣的數據,無法歸檔和解檔,系統崩潰        

        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;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章