iOS笔记-归档和解档

87 篇文章 1 订阅
</pre><p></p><pre code_snippet_id="1617532" snippet_file_name="blog_20160320_2_6406692" name="code" class="objc">#import <Foundation/Foundation.h>

@interface Person : NSObject<NSCoding>

// 默认会是什么呢?
@property (nonatomic, copy) NSString *name;
// 默认是strong类型
@property (nonatomic, strong) NSMutableArray *array;

@property (nonatomic, assign)NSInteger age;

@end

#import "Person.h"

@implementation Person

//解档
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super init]) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.array = [aDecoder decodeObjectForKey:@"array"];
        self.age  = [aDecoder decodeIntegerForKey:@"age"];
    }
    return self;
}
//归档
- (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:self.array forKey:@"array"];
    [aCoder encodeInteger:self.age forKey:@"age"];
}


- (void)dealloc{
    NSLog(@"Person 对象已经销毁!");
}


- (NSString *)description{
    
    NSString *desc = [NSString stringWithFormat:@"name:%@\nage:%ld\narray:%@",self.name,self.age,self.array];
    return desc;
}


在viewController.m中:

//(1)第一种方式:归档 (缺点:一个对象保存为一个文件)
    NSArray *arrayArchi = @[@"1",@"2",@"3"];
    NSString *pathArchi1 = [NSHomeDirectory() stringByAppendingPathComponent:@"archive1"];
    BOOL isOK1 = [NSKeyedArchiver archiveRootObject:arrayArchi toFile:pathArchi1];
    if (isOK1) {
        
        //解档
        NSArray *arrayUnarchi = [NSKeyedUnarchiver unarchiveObjectWithFile:pathArchi1];
        NSLog(@"arrayUnarchi:%@",arrayUnarchi);
    }
    
    //(2)第二种方式:归档 (优点:多个对象归档为一个文件)
    NSString *pathArchi2 = [NSHomeDirectory() stringByAppendingPathComponent:@"archive2"];
    NSMutableData *mData = [[NSMutableData alloc] init];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:mData];
    [archiver encodeObject:arrayArchi forKey:@"array"];
    [archiver encodeInt:2 forKey:@"number"];
    [archiver encodeFloat:3.0 forKey:@"price"];
    [archiver finishEncoding];//完成归档,把归档数据赋值到NSMutableData中
    
    [mData writeToFile:pathArchi2 atomically:YES];
    
    //解档
    NSMutableData *mDataUnAr = [[NSMutableData alloc] initWithContentsOfFile:pathArchi2];
    NSKeyedUnarchiver *unarchivr = [[NSKeyedUnarchiver alloc] initForReadingWithData:mDataUnAr];
    NSArray *arrayUnarc = [unarchivr decodeObjectForKey:@"array"];
    int number = [unarchivr decodeIntForKey:@"number"];
    double price = [unarchivr decodeDoubleForKey:@"price"];
    NSLog(@"%@\n%d\n%f\n",arrayUnarc,number,price);
    
    //(3)自定义对象归档,要先实现NSCoding协议,实现两个方法
    //- (instancetype)initWithCoder:(NSCoder *)aDecoder;
    //- (void)encodeWithCoder:(NSCoder *)aCoder;
    NSString *pathArchi3 = [NSHomeDirectory() stringByAppendingPathComponent:@"archive3"];
    NSMutableArray *personArray = [NSMutableArray new];
    for (int i = 0; i<5; i++) {
        Person *person = [[Person alloc] init];
        person.name = [NSString stringWithFormat:@"person%d",i+1];
        person.age  =  20+ arc4random_uniform(10);
        person.array = [NSMutableArray arrayWithArray:@[@(i+ arc4random_uniform(10)),@(i+ arc4random_uniform(10))]];
        [personArray addObject:person];
    }
    //归档
    BOOL isOK3 = [NSKeyedArchiver archiveRootObject:personArray toFile:pathArchi3];
    if (isOK3) {
        //解档
        NSMutableArray *personArray = [NSKeyedUnarchiver unarchiveObjectWithFile:pathArchi3];
        for (Person *person in personArray) {
            NSLog(@"%@",person);
        }
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值