• 数组的归档
  • 对象的归档
  • NSData多个对象的归档
  • NSArray多个对象的归档
  • 偏好设置的存储

1.NSString、NSDictionary、NSArray、NSData、NSNumber等类型的对象,可以直接用NSKeyedArchiver进行归档和恢复

2.不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以

1⃣️归档和恢复

支持复杂的数据对象,包括自定义对象。

对自定义对象进行归档处理,需要实现NSCoding协议

2⃣️NSCoding协议方法

encodeWithCoder

initWithCoder

3⃣️NSKeyedArchiver & NSKeyedUnarchiver

4⃣️对于多个对象可以通过NSArray或者NSData进行归档

一、数组的归档

// 演练1 NSArray归档
// 注意,可以通过修改文件名查看归档文件内容
NSString *path = [docDir stringByAppendingPathComponent:@"array.archive"];
// 定义数组
NSArray *array = @[@"张三", @"李四", @"王五"];
// 归档数组
[NSKeyedArchiver archiveRootObject:array toFile:path];// 恢复数组
NSArray *unarchivedArray = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSLog(@"%@", unarchivedArray);

二、对象的归档

1⃣️重写NSCoding两个方法

// 归档
- (void)encodeWithCoder:(NSCoder *)aCoder
{[aCoder encodeObject:_name forKey:@"name"];// 图像数据NSData *imageData = UIImagePNGRepresentation(_userImage);[aCoder encodeObject:imageData forKey:@"imageData"];[aCoder encodeInt:_age forKey:@"age"];[aCoder encodeObject:_phone forKey:@"phone"];
}// 恢复
- (id)initWithCoder:(NSCoder *)aDecoder
{[self setName:[aDecoder decodeObjectForKey:@"name"]];// 图像数据NSData *imageData = [aDecoder decodeObjectForKey:@"imageData"];[self setUserImage:[UIImage imageWithData:imageData]];[self setAge:[aDecoder decodeIntForKey:@"age"]];[self setPhone:[aDecoder decodeObjectForKey:@"phone"]];return self;
}

2⃣️归档和恢复

// 归档文件路径
NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [documents[0]stringByAppendingPathComponent:@"personInfo.plist"];// 新建Person对象
Person *person = [Person initPersonWithName:_userNameText.text image:_userImageView.image age:_ageText.text.intValue phone:_phoneText.text];// 归档用户数据
[NSKeyedArchiver archiveRootObject:person toFile:path];

// 恢复文件路径
NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [documents[0]stringByAppendingPathComponent:@"personInfo.plist"];// 恢复Person对象
Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:path];[_userNameText setText:person.name];
[_userImageView setImage:person.userImage];
[_ageText setText:[NSString stringWithFormat:@"%d", person.age]];
[_phoneText setText:person.phone];

三、NSData多个对象的归档(用于不同对象)

1⃣️归档

// 演练3. 归档多个对象
- (void)archivedMultiObjects
{// 获取文档目录NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);// 存档路径NSString *path = [documents[0]stringByAppendingPathComponent:@"multiUsers.plist"];Person *person1 = [Person initPersonWithName:@"张三" image:[UIImage imageNamed:@"头像1.png"] age:18 phone:@"110"];Person *person2 = [Person initPersonWithName:@"李四" image:[UIImage imageNamed:@"头像2.png"] age:32 phone:@"120"];// 新建一块可变的数据区NSMutableData *data = [NSMutableData data];// 将数据区连接到一个NSKeyedArchiver对象NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];// 开始存档对象,存档的数据都会存储到NSMutableData中[archiver encodeObject:person1 forKey:@"person1"];[archiver encodeObject:person2 forKey:@"person2"];// 存档完毕(一定要调用这个方法)
    [archiver finishEncoding];// 将存档的数据写入文件
    [data writeToFile:path atomically:YES];
}

2⃣️恢复

- (void)unarchiverPersonInfo:(UIButton *)sender
{// 演练3. 恢复NSData归档的多个数据// 获取文档目录NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);// 存档路径NSString *path = [documents[0]stringByAppendingPathComponent:@"multiUsers.plist"];// 演练4. 使用NSArray归档多个对象NSString *path2 = [documents[0]stringByAppendingPathComponent:@"multiUsers2.plist"];NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:path2];for (Author *author in array) {NSLog(@"%@ %d %@ %@", author.name, author.age, author.phone, author.bookName);}// 从文件读取数据NSData *data = [NSData dataWithContentsOfFile:path];// 根据数据,解析成一个NSKeyedUnarchiver对象NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];// 恢复对象Person *person1 = [unarchiver decodeObjectForKey:@"person1"];Person *person2 = [unarchiver decodeObjectForKey:@"person2"];// 恢复完毕(一定要调用这个方法)
    [unarchiver finishDecoding];// 根据按钮Tag设置UIif (sender.tag == 0) {[_userNameText setText:person1.name];[_userImageView setImage:person1.userImage];[_ageText setText:[NSString stringWithFormat:@"%d", person1.age]];[_phoneText setText:person1.phone];} else {[_userNameText setText:person2.name];[_userImageView setImage:person2.userImage];[_ageText setText:[NSString stringWithFormat:@"%d", person2.age]];[_phoneText setText:person2.phone];}
}

四、NSArray多个对象的归档(用于相同对象)

1⃣️写一个Author类,继承Person

类中需要重写两个方法

// 归档
- (void)encodeWithCoder:(NSCoder *)aCoder
{[super encodeWithCoder:aCoder];[aCoder encodeObject:_bookName forKey:@"bookName"];
}// 恢复
- (id)initWithCoder:(NSCoder *)aDecoder
{self = [super initWithCoder:aDecoder];if (self) {_bookName = [aDecoder decodeObjectForKey:@"bookName"];}return self;
}

2⃣️使用NSArray归档

// 演练4. 使用NSArray归档多个对象
- (void)archivedMultiObjectsWithArray;
{// 获取文档目录NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);// 存档路径NSString *path = [documents[0]stringByAppendingPathComponent:@"multiUsers2.plist"];Author *author1 = [Author initPersonWithName:@"张大师" image:[UIImage imageNamed:@"头像1.png"] age:30 phone:@"110" bookName:@"C语言基础"];Author *author2 = [Author initPersonWithName:@"张大师" image:[UIImage imageNamed:@"头像1.png"] age:30 phone:@"110" bookName:@"C++宝典"];NSArray *array = @[author1, author2];// 注意此处不能使用 [array writeToFile:path atomically:YES];
    [NSKeyedArchiver archiveRootObject:array toFile:path];
}

3⃣️解档

NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);// 存档路径NSString *path = [documents[0]stringByAppendingPathComponent:@"multiUsers.plist"];// 演练4. 使用NSArray归档多个对象NSString *path2 = [documents[0]stringByAppendingPathComponent:@"multiUsers2.plist"];NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:path2];for (Author *author in array) {NSLog(@"%@ %d %@ %@", author.name, author.age, author.phone, author.bookName);}

五、偏好设置的存储

注意:UserDefaults设置数据时,不是立即写入,而是根据时间戳定时地把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还没有写入磁盘,应用程序就终止了。

出现以上问题,可以通过调用synchornize方法强制写入:

[defaults synchronize];

1⃣️偏好设置保存

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];[defaults setObject:@"王二麻子" forKey:@"UserName"];[defaults setFloat:18.5 forKey:@"fontSize"];[defaults setBool:NO forKey:@"purchased"];[[NSUserDefaults standardUserDefaults]setObject:@"110" forKey:@"Phone"];// 同步命令[[NSUserDefaults standardUserDefaults]synchronize];

2⃣️取出

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *userName = [defaults objectForKey:@"userName"];
float fontSize = [defaults floatForKey:@"fontSize"];
BOOL autoLogin = [defaults boolForKey:@"autoLogin"];

转载于:https://www.cnblogs.com/letougaozao/p/3661171.html

数据存储之Archiver、Unarchiver、偏好设置相关推荐

  1. 【达内课程】数据存储

    文章目录 数据存储介绍 SharedPreferences:偏好设置 I/O存储/文件存储 数据存储介绍 数据存储也称之为数据持久化.表现为将程序处理过程中需要保存的数据存储到硬盘的某个文件中.在 A ...

  2. iOS偏好设置的存储注意事项

    // //  ViewController.m //  偏好设置 // //  Created by GuoYule on 15/3/10. //  Copyright (c) 2015年 GuoYu ...

  3. 05_ClickHouse、MergeTree系列引擎概述与存储结构、建表模板、建表语句、MergeTree设置、建表示例、数据存储、数据片段(data part)

    2.MergeTree系列引擎概述与存储结构 2.1.建表模板 2.2.建表语句 2.3.MergeTree设置 2.4.建表示例 2.5.数据存储 2.6.数据片段(data part) 2.Mer ...

  4. Android五大数据存储

    前言 数据存储可谓是Android中灰常灰常重要的一部分了.任何一个应用离不开数据的存储,有时需内存存储,有时需本地存储,还有时需要两个进程间传输数据,等等.那接下来介绍的五大存储中将包括了所有的应用 ...

  5. Windows 8 应用开发 - 本地数据存储

    原文:Windows 8 应用开发 - 本地数据存储 在应用中通常会遇到用户主动或被动存储信息的情况,当应用关闭后这些数据仍然会存储在本地设备上,用户下次重新激活应用时会自动加载这些数据.下面将通过一 ...

  6. ios应用数据存储方式(偏好设置)

    iOS开发UI篇-ios应用数据存储方式(偏好设置) 一.简单介绍 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能 每个应用 ...

  7. ios应用数据存储方式(偏好设置)-转

    一.简单介绍  1.很多ios应用都支持偏好设置,比如保存用户名,密码,字体大小等设置,ios提供了一套标准的解决方案来为应用加入偏好设置功能.  2.每个应用都有个NSUserDefaults实例, ...

  8. iOS开发UI篇—ios应用数据存储方式(偏好设置)

    一.简单介绍 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能 每个应用都有个NSUserDefaults实例,通过它来存取偏 ...

  9. 1211笔记关于//modal//更改窗口的根控制器//数据存取//Plist属性列表//-“沙盒机制”//plis属性列表//偏好设置//归档普通对象//联系人数据存储//协议与回调函数...

    笔记的完整版pdf文档下载地址:https://www.evernote.com/shard/s227/sh/aba2aa01-4d96-429d-9bbd-2f285c7c0c79/65772262 ...

最新文章

  1. android 是否允许打印debug级别日志的开关_Android学习——日志使用
  2. windbg调试masm生成程序的方法
  3. 强制回收和IDisposable.Dispose方法
  4. 深度学习:卷积神经网络(convolution neural network)
  5. 阿里媒体转码公共参数_Xuggler教程:转码和媒体修改
  6. t分布f分布与样本均值抽样分布_分布模拟1——MCMC抽样方法
  7. r语言 运算符_R语言运算符
  8. one-hot与词袋模型
  9. 微信做了个新功能,网友并不买账:就为了给QQ充会员?
  10. python定义函数名typo错误_17个新手常见Python运行时错误
  11. oracle中慢sql优化思路
  12. Flink 流批一体在阿里的落地
  13. C语言指令启动mcs51计时器是,单片机原理及应用-中国大学mooc-题库零氪
  14. 最新知宇企业自动发卡系统源码 易支付接口版
  15. awk命令详解+示例
  16. w ndows10专业版连接不上网,Windows10连不上无线网怎么办 Windows10修复网络教程
  17. firefox + pentadactyl 实现纯绿色高效易扩展浏览器(同时实现修改默认状态栏样式)...
  18. Unity中颜色空间(Color)HSV,HSB,HSL
  19. Java实现 蓝桥杯 算法提高 三进制数位和
  20. redisson 主从模式Unsupported protocol version 50_华米Amazfit Pop智能手表发布:支持50米防水,血氧检测 - 数码 - IT商业网...

热门文章

  1. 列出两个日期间的所有日期(使用oracle的rownum实现在sql中使用循环)
  2. Photoshop把漂亮湖景照片调成唯美雪景效果
  3. 华为 2020 招聘状态查看_香河招聘网人才库,5000+求职简历!缺人才的老板可要抓紧了!【10月31日更新】...
  4. 计算机知识宣传黑板报,计算机黑板报内容
  5. warning警告问题解决1
  6. 视频号新手必备:定位、涨粉、私域全攻略
  7. 开发三年的Java程序员,如何摆脱日复一日的CRUD?
  8. sitf+LK+pnp 识别、跟踪图片,并求三维旋转角度(四) -----LK光流跟踪
  9. ei加声调怎么加_ei的四个声调怎么写
  10. coursera课程learning how to learn的主要内容-学会学习(一)