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

  NSString,NSNumber,NSArray,NSDictionary等简单对象可以方便的存储在本地沙盒文件中,而复杂的对象,诸如属性、方法较多的类对象,就需要使用归档反归档方法(序列化与反序列化),以NSData方式进行存储。

  归档反归档,主要的操作顺序是:编码(enCoding) -> 归档(archiver) -> 解码(deCoding) -> 反归档(unarchiver)

  1.编码与解码的方法,需要在类的声明文件中接受<NSCoding>协议,在实现文件.m中完成协议方法:  

 1 /*
 2  * Model.h 接受NSCoding协议
 3  */
 4
 5 #import <Foundation/Foundation.h>
 6 #import <UIKit/UIKit.h>
 7
 8 @interface Model : NSObject<NSCoding>
 9 @property(nonatomic,strong)NSString *name;
10 @property(nonatomic,assign)NSInteger num;
11
12 - (instancetype)initWithName:(NSString *)name num:(NSInteger)num;
13 @end
 1 /*
 2  * Model.m 实现编码与解码的协议方法
 3  */
 4
 5 #import "Model.h"
 6
 7 @implementation Model
 8 - (instancetype)initWithName:(NSString *)name num:(NSInteger)num{
 9     self = [super init];
10     if(self){
11         self.name = name;
12         self.num = num;
13     }
14     return self;
15 }
16
17 // 编码
18 - (void)encodeWithCoder:(NSCoder *)aCoder{
19     [aCoder encodeObject:self.name forKey:@"name"];
20     [aCoder encodeObject:@(self.num) forKey:@"num"];
21 }
22
23 // 解码
24 - (instancetype)initWithCoder:(NSCoder *)aDecoder{
25     self = [super init];
26     if(self){
27         self.name = [aDecoder decodeObjectForKey:@"name"];
28         self.num = [[aDecoder decodeObjectForKey:@"num"] integerValue];
29     }
30     return self;
31 }
32
33 @end

  2.归档 - 保存复杂对象;反归档 - 获取对象

 1 #import "ViewController.h"
 2 #import "Model.h"
 3
 4 @interface ViewController ()
 5 @property (weak, nonatomic) IBOutlet UIImageView *image;
 6 @property (weak, nonatomic) IBOutlet UITextField *nameText;
 7 @property (nonatomic,strong)NSString *path;
 8 @end
 9
10 @implementation ViewController
11
12 - (void)viewDidLoad {
13     [super viewDidLoad];
14
15     // 获取沙盒路径
16     self.path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"data.data"];
17 }
18
19 // 归档保存对象
20 - (IBAction)save:(UIButton *)sender {
21     // 创建对象
22     Model *m = [[Model alloc] initWithName:@"测试" num:101];
23
24     // 创建NSData(可变),NSKeyedArchiver(实现归档的对象)
25     NSMutableData *data = [NSMutableData data];
26     NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
27
28     // 对象进行编码归档
29     [archiver encodeObject:m forKey:@"m"];
30
31     // 归档完成(必需)
32     [archiver finishEncoding];
33
34     // 写入沙盒路径文件中
35     [data writeToFile:self.path atomically:YES];
36 }
37
38 // 反归档解码获取对象
39 - (IBAction)get:(UIButton *)sender {
40     // 创建NSData(可变), NSKeyedUnarchiver(实现反归档的对象)
41     NSMutableData *data = [NSMutableData dataWithContentsOfFile:self.path];
42     NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
43
44     // 反归档解码获取对象
45     Model *m = [unarchiver decodeObjectForKey:@"m"];
46
47     self.nameText.text = [NSString stringWithFormat:@"%@ %ld", m.name, m.num];
48 }
49
50 - (void)didReceiveMemoryWarning {
51     [super didReceiveMemoryWarning];
52     // Dispose of any resources that can be recreated.
53 }
54
55 @end

  *.主要沙盒路径:

NSHomeDirectory----------------------->沙盒主路径
NSDocumentDirectory------------------->Documents文件夹
NSLibraryDirectory-------------------->Library文件夹
NSCachesDirectory--------------------->Caches文件夹
NSTemporaryDirectory------------------>tmp文件夹
时间: 2025-01-02 16:28:08

归档反归档 - 本地沙盒存储复杂对象的相关文章

沙盒机制 归档 反归档

//文件路径 //1.Home主目录:里面有Document, library,tem,和一个应用程序 NSLog(@"%@",NSHomeDirectory()); //2.Document路径 NSString *docuPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; NSLog(@"%@",docuPath); //3.Librar

iOS 字符串的UTF8 编码 以及归档反归档

NSString* str = [@"%E4%B8%AD%E5%9B%BD" stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSLog(@"str=%@", str); NSString *str1 = @"中国"; NSString *str2 = [str1 stringByAddingPercentEscapesUsingEncoding:NSUTF8

归档反归档

//归档 反归档(麻烦的方法)    /*    //归档    //创建Person实例对象    Person *person1=[[Person alloc]init];    [email protected]"bbb";    [email protected]"39";        Person *person2=[[Person alloc]init];    [email protected]"aaa";    [email p

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 Cha

UI14-沙盒机制,文件的读写,文件管理器的增删移动复制,归档和反归档。

1.复杂对象的归档反归档.person类的使用acoder,进行编码.使用decoder进行根据标记,解码. 2.再使用多个person类中,需要转化工具和解转化工具,achiver,unchiever,记得结束要finish. 3.文件管理器 对文件和文件夹的增删改移动. 4.读取沙盒的文件,和三个主要路径 5.简单类的读取写入,string,数组,和字典.

IOS文件操作和自定义对象的归档(序列化)、反归档(反序列化)

IOS对文件操作包含文件的创建,读写,移动,删除等操作. 1.文件的创建: //设定文本框存储文件的位置 NSString *strFilePath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]; //指定存储文件的文件名 NSString *fileName=[strFilePath stringByAppendingPathComponent:@

归档与反归档

一.归档操作 NSArray *array = @[@"归档",@"反归档",@"开始"]; //1.创建归档对象 NSMutableData *data = [NSMutableData data]; NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]  initForWritingWithMutableData:data]; //2.归档 [archiver encodeObject:pe

iOS中的 沙盒文件夹 (数据的写入和读取,归档和反归档)

AppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { /** 沙盒中文件夹: 1.Documents : 存储长久保存的数据 2.library: Caches:存放的缓存,比如:视频,音频,图片,小说等等 Perferences:存储偏好设置,比如:应用程序是否是第一次启动 保存用户名和密码. 3.t

【学习ios之路:UI系列】iOS沙盒机制,文件读取,归档与反归档

1.IOS中的沙盒机制 IOS中的沙盒机制是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容.所有的非代码文件都保存在这个地方,比如图片.声音.属性列表和文本文件等. 特点: 1.每个应用程序都在自己的沙盒内 2.不能随意跨越自己的沙盒去访问别的应用程序沙盒的内容 3.应用程序向外请求或接收数据都需要经过权限认证 每个沙盒含有3个文件夹:Documents, Library 和 tmp.Library包含Caches.Preferences目录.如下图