iOS 系统对象和自定义对象的归档Archiver

来源:互联网 发布:mac 快捷键 箭头 编辑:程序博客网 时间:2024/05/10 04:13

 

归档,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;

}

0 0
原创粉丝点击