Archive(归档/反归档)

Posted 恒远也

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Archive(归档/反归档)相关的知识,希望对你有一定的参考价值。

 1 #import "ViewController.h"
 2 #import "Person.h"
 3 @interface ViewController ()
 4 
 5 @end
 6 
 7 @implementation ViewController
 8 
 9 - (void)viewDidLoad {
10     [super viewDidLoad];
11     Person *p1 = [Person new];
12     p1.name = @"Jackie Chan";
13     p1.age = 16;
14     //将复杂对象转为NSData,归档(序列化)
15     NSData *p1Data = [NSKeyedArchiver archivedDataWithRootObject:p1];
16     
17     //创建路径,存储p1Data
18     NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"person"];
19     NSLog(@"%@",path);
20     [p1Data writeToFile:path atomically:YES];
21 
22     //读取文件中的数据
23     NSData *p2Data = [NSData dataWithContentsOfFile:path];
24     Person *p2 = [NSKeyedUnarchiver unarchiveObjectWithData:p2Data];
25     
26     NSLog(@"%@,%ld",p2.name,p2.age);
27     p2.name = @"Bruce Lee";
28     p2.age = 18;
29 
30     //使用归档工具进行归档
31     NSMutableData *mdata = [[NSMutableData alloc] init];
32     NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:mdata];
33     //进行归档
34     [archiver encodeObject:p1 forKey:@"person1"];
35     [archiver encodeObject:p2 forKey:@"person2"];
36     //结束归档
37     [archiver finishEncoding];
38     NSLog(@"%@",mdata);
39     //反归档
40     //反归档工具
41     NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:mdata];
42     //进行反归档
43     Person *p3 =  [unarchiver decodeObjectForKey:@"person1"];
44     Person *p4 = [unarchiver decodeObjectForKey:@"person2"];
45     NSLog(@"%@ %ld",p3.name,p3.age);
46     NSLog(@"%@ %ld",p4.name,p4.age);
47     //结束反归档
48     [unarchiver finishDecoding];
49 }
1 #import <Foundation/Foundation.h>
2 
3 @interface Person : NSObject<NSCoding>
4 @property(nonatomic,copy) NSString *name;
5 @property (nonatomic,assign) NSInteger age;
6 @end
 1 #import "Person.h"
 2 
 3 @implementation Person
 4 //归档(序列化) 协议方法,将属性转为二进制数据
 5 - (void)encodeWithCoder:(NSCoder *)aCoder
 6 {
 7     [aCoder encodeObject:self.name forKey:@"name"];
 8     [aCoder encodeInteger:self.age forKey:@"age"];
 9 }
10 //反归档(反序列化)方法,将二进制数据恢复为属性
11 - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder
12 {
13     self = [super init];
14     if (self) {
15         self.name = [aDecoder decodeObjectForKey:@"name"];
16         self.age = [aDecoder decodeIntegerForKey:@"age"];
17         
18     }
19     return self;
20 }
21 @end

 

以上是关于Archive(归档/反归档)的主要内容,如果未能解决你的问题,请参考以下文章

归档反归档 - 本地沙盒存储复杂对象

iOS archive(归档)的总结

如何在归档模式下,更改归档日志路径

数据存储值归档Archive

我的 iPhone 应用程序被归档为“Mac App Archive”而不是“iOS 应用程序归档”

如何使用 Compress-Archive 压缩/归档隐藏文件?