归档(存为二进制文件)


NSString *str = @“my name is Lemon";
NSString *path = @“/Users/student/Desktop/string.data";


//字符串的归档和解档
1.归档
[NSKeyedArchiver archiveRootObject:str toFile:path];

2.解档
NSString *newStr = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
        NSLog(@"newStr = %@“,newStr);


//数组的归档和解档

        NSArray *arr = [[NSArray alloc] initWithObjects:@"柠檬",@"芒果",@"山楂", nil];
        [NSKeyedArchiver archiveRootObject:arr toFile:path];
        NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
        for (id obj in array)
        {
            NSLog(@"%@",obj);
        }



//如果想要对这个类的对象进行对象和归档
//1.遵守归档的协议 NSCoding
//2.实现协议中需要实现的两个方法:归档和解档
@interface Person : NSObject<NSCoding>
{
    NSString* _name;
    int _age;
}

@property NSString *name;
@property int age;

@end

#import "Dog.h"

@implementation Dog
//编码的方法,归档的时候,系统会使用这个方法
- (void)encodeWithCoder:(NSCoder *)aCoder
{
   //
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:[NSNumber numberWithInt:self.age] forKey:@"age"];
}
//解码的方法,解档的时候系统会使用这个方法
- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init])
    {
        //为当前对象的属性赋值
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.age = [[aDecoder decodeObjectForKey:@"age"] intValue];
    }
    return self;
}

@end


#import "Dog.h"

@interface WolfDog : Dog<NSCoding>
{
    //属性
    int _attackPower;
}

@property int attackPower;

@end
@implementation WolfDog

//为了能归档和解档这个类的对象,需要实现归档和解档的两个方法
-(void)encodeWithCoder:(NSCoder *)aCoder
{
    //如果父类有归档和解档的方法,子类需要调用
    [super encodeWithCoder:aCoder];
    
    [aCoder encodeObject:[NSNumber numberWithInt:self.attackPower] forKey:@"attackPower"];
    
}

-(id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super initWithCoder:aDecoder])
    {
        self.attackPower = [[aDecoder decodeObjectForKey:@"attackPower"] intValue];
    }
    return self;
}
@end

Dog *dog = [[Dog alloc] init];
        dog.name = @"qu ming zen me jiu na me nan";
        dog.age = 16;
        //归档的基本原理
        path =@"/Users/student/Desktop/dog.data";
        //系统如何知道归档不同的对象呢?
        //需要对象所在的类提供两个方法
        //       如何归档
        //       如何解档
        [NSKeyedArchiver archiveRootObject:dog toFile:path];
        
        //解档
         Dog *newDog =[NSKeyedUnarchiver unarchiveObjectWithFile:path];
        //NSLog(@"nsmr = %@,age = %d",newDog.name,newDog.age);
        
        WolfDog *wd = [[WolfDog alloc] init];
        wd.name = @"路西恩";
        wd.age = 28;
        wd.attackPower = 10000;
        
        path = @"/Users/student/Desktop/wolfDog.data";
        [NSKeyedArchiver archiveRootObject:wd toFile:path];
        //解档
        WolfDog *newWd = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
        NSLog(@"name = %@, age = %d, attackPower = %d",newWd.name,newWd.age,newWd.attackPower);