IOS数据持久化NSKeyedArchiver使用

原创
2016/11/02 11:22
阅读数 507

1定义一个AddressCard类,等会将该类实例化一个对象存入NSKeyedArchiver.

//
//  AddressCard.h
//  NSKeyedArchiverDemo
//
//  Created by  罗若文 on 2016/11/2.
//  Copyright © 2016年 罗若文. All rights reserved.
//  参考http://www.cnblogs.com/xiaobaizhu/p/4011332.html
/**
 归档需要注意的是:
 1.同一个对象属性,编码/解码的key要相同!
 2.每一种基本数据类型,都有一个相应的编码/解码方法。
 如:encodeObject方法与decodeObjectForKey方法,是成对出现的。
 3.如果一个自定义的类A,作为另一个自定义类B的一个属性存在;那么,如果要对B进行归档,那么,B要实现NSCoding协议。并且,A也要实现NSCoding协议。
 */

#import <Foundation/Foundation.h>

@interface AddressCard : NSObject<NSCoding>//要用NSKeyedArchiver存储就要申明实现NSCoding协议
@property NSString *name;
@property NSString *email;
@property int salary;

-(void)print;
@end
//
//  AddressCard.m
//  NSKeyedArchiverDemo
//
//  Created by  罗若文 on 2016/11/2.
//  Copyright © 2016年 罗若文. All rights reserved.
//

#import "AddressCard.h"

@implementation AddressCard

-(void)print{
    NSLog(@"姓名:%@   邮箱:%@   薪水:%d",self.name,self.email,self.salary);
}


#pragma mark- ----------NSCoding协议-需要实现以下的encodeWithCoder和initWithCoder都是成对出现.每个属性都要进行设置,对应的key都要相同---------
- (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:self.name forKey:@"AddressCard_name"];
    [aCoder encodeObject:self.email forKey:@"AddressCard_email"];
    [aCoder encodeInt:self.salary forKey:@"AddressCard_salary"];
    
}
- (id)initWithCoder:(NSCoder *)aDecoder{
    self.name=[aDecoder decodeObjectForKey:@"AddressCard_name"];
    self.email=[aDecoder decodeObjectForKey:@"AddressCard_email"];
    self.salary=[aDecoder decodeIntForKey:@"AddressCard_salary"];
    return self;
}
@end

然后接下来就是使用

//
//  ViewController.m
//  NSKeyedArchiverDemo
//
//  Created by  罗若文 on 2016/11/2.
//  Copyright © 2016年 罗若文. All rights reserved.
//

#import "ViewController.h"
#import "AddressCard.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self.view setBackgroundColor:[UIColor whiteColor]];
    
    //获得文件路径 用来放NSKeyedArchiver
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *filePath = [documentPath stringByAppendingPathComponent:@"file.archiver"];
    
    AddressCard *obj=[[AddressCard alloc]init];
    obj.name=@"luoruowen";
    obj.email=@"luoruowen@vip.qq.com";
    obj.salary=5000;
    BOOL isSuccess=NO;
    
    //将AddressCard对象存入NSKeyedArchiver 这边可以存入任何对象数据,取出来的也是对应的对象数据
    isSuccess= [NSKeyedArchiver archiveRootObject:obj toFile:filePath];
    if (isSuccess) {
        NSLog(@"Success");
    }else{
        NSLog(@"False");
    }
    
    // 反归档 取出AddressCard对象
    AddressCard *objTmp=[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    [objTmp print];
    
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end

当然不止存对象, 平常的数据也是可以存储,存入什么取出来的就是什么.

展开阅读全文
打赏
0
0 收藏
分享
加载中
该评论暂时无法显示,详情咨询 QQ 群:912889742
更多评论
打赏
1 评论
0 收藏
0
分享
返回顶部
顶部