美文网首页
iOS开发数据存储之NSKeyedArchiver

iOS开发数据存储之NSKeyedArchiver

作者: 西瓜皮奥特曼 | 来源:发表于2017-07-19 13:13 被阅读99次

    忘记出自哪里了:
    如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复
    不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以
    NSCoding协议有2个方法:
    encodeWithCoder:
    每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量,可以使用encodeObject:forKey:方法归档实例变量

    initWithCoder:
    每次从文件中恢复(解码)对象时,都会调用这个方法。一般在这个方法里面指定如何解码文件中的数据为对象的实例变量,可以使用decodeObject:forKey方法解码实例变量

    归档系统自带类:

    NSArray * array = [NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
    NSString * path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString * filePath = [path stringByAppendingPathComponent:@"bbb.xx"];
    [NSKeyedArchiver archiveRootObject:array toFile:filePath];
        
    NSArray * arrays = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    NSLog(@"dict = %@",arrays);
    

    归档自定义类:

    Others * others = [[Others alloc] init];
    others.name = @"小明";
    others.age = @"20";
        
    NSString * parh = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString * filePath = [parh stringByAppendingPathComponent:@"cccc.xxx"];
    [NSKeyedArchiver archiveRootObject:others toFile:filePath];
        
    Others * other = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    NSLog(@"name = %@, age = %@",other.name,others.age);
    

    Other.h

    #import <Foundation/Foundation.h>
    
    @interface Others : NSObject
    
    @property (strong , nonatomic) NSString * name;
    @property (strong , nonatomic) NSString * age;
    
    @end
    

    Other.m

    #import "Others.h"
    
    //NSKeyedArchiver归档如果想将一个自定义对象保存到文件中必须实现NSCoding协议
    @interface Others ()<NSCoding>
    
    @end
    
    @implementation Others
    
    //当从文件中读取一个对象的时候就会调用该方法
    //也在该方法中说明如何读取储存在文件中的对象
    - (instancetype)initWithCoder:(NSCoder *)coder
    {
        self = [super init];
        if (self) {
            self.name = [coder decodeObjectForKey:@"name"];
            self.age = [coder decodeObjectForKey:@"age"];
        }
        return self;
    }
    
    //将一个自定义对象保存到文件的时候就会调用该方法
    //也在该方法中说明如何储存自定义对象的属性
    -(void)encodeWithCoder:(NSCoder *)aCoder
    {
        [aCoder encodeObject:self.name forKey:@"name"];
        [aCoder encodeObject:self.age forKey:@"age"];
    }
    
    @end
    

    相关文章

      网友评论

          本文标题:iOS开发数据存储之NSKeyedArchiver

          本文链接:https://www.haomeiwen.com/subject/farlkxtx.html