• 数组的归档
  • 对象的归档
  • 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[]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[]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[]stringByAppendingPathComponent:@"multiUsers.plist"]; Person *person1 = [Person initPersonWithName:@"张三" image:[UIImage imageNamed:@"头像1.png"] age: phone:@""];
Person *person2 = [Person initPersonWithName:@"李四" image:[UIImage imageNamed:@"头像2.png"] age: phone:@""]; // 新建一块可变的数据区
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[]stringByAppendingPathComponent:@"multiUsers.plist"]; // 演练4. 使用NSArray归档多个对象
NSString *path2 = [documents[]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设置UI
if (sender.tag == ) {
[_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[]stringByAppendingPathComponent:@"multiUsers2.plist"]; Author *author1 = [Author initPersonWithName:@"张大师" image:[UIImage imageNamed:@"头像1.png"] age: phone:@"" bookName:@"C语言基础"];
Author *author2 = [Author initPersonWithName:@"张大师" image:[UIImage imageNamed:@"头像1.png"] age: phone:@"" 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[]stringByAppendingPathComponent:@"multiUsers.plist"]; // 演练4. 使用NSArray归档多个对象
NSString *path2 = [documents[]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:@"" 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"];

数据存储之Archiver、Unarchiver、偏好设置的更多相关文章

  1. 数据存储之plist、偏好设置

    // 偏好设置--------------------------------- // 存储基本类型数据 NSUserDefaults *defaults = [NSUserDefaults stan ...

  2. iOS数据持久化文件读写之偏好设置

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

  3. iOS中偏好设置的创建,数据写入与读取

    NSUserDefaults与NSDictinary? 应用通过NSUserDefaults用键值对的方式来读取和保存偏好设置数据,与通过键从NSDictionary对象中获取数据一样,不同之处在于N ...

  4. IOS 偏好设置数据 存 取(Preferences文件夹)

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

  5. iOS——偏好设置的创建,数据写入与读取

    NSUserDefaults与NSDictinary? 应用通过NSUserDefaults用键值对的方式来读取和保存偏好设置数据,与通过键从NSDictionary对象中获取数据一样,不同之处在于N ...

  6. 最全的iOS数据存储方法

    目的 项目准备运用的Core Data进行本地数据存储,本来打算只写一下Core Data的,不过既然说到了数据存储,干脆来个数据存储基础大总结!本文将对以下几个模块进行叙述. 沙盒 Plist Pr ...

  7. 数据存储常用5种方式plist、Preference、NSCoding、SQLite3、Core Data

    数据存储 iOS应用数据存储的常用方式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core Data ...

  8. iOS应用数据存储的常用方式

    iOS应用 数据存储的常用方式 XML属性列表 plist Preference 偏好设置 NSKeyedArchiver 归档 Core Data SQLite3 应用沙盒: Layer:     ...

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

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

随机推荐

  1. 【09】react 之 表单组件

    不太清楚有多少初学React的同学和博主当时一样,在看完React的生命周期.数据流之后觉得已经上手了,甩开文档啪啪啪的开始敲了起来.结果...居然被一个input标签给教做人了. 故事是这样的:首先 ...

  2. cocoaPod的Podfile文件的创建和内容格式

    Podfile创建: 1.终端中,cd到项目总目录(cd +路径名) cd/........./......../...../项目名 2.终端中继续建立Podfile(配置文件) touch Podf ...

  3. Docker Daemon 连接方式详解

    前言 在 Docker 常用详解指令 一文中粗粗提了一下, Docker 是分为客户端和服务端两部分的, 本文将介绍客户端是如何连接服务端的. 连接方式 1. UNIX域套接字 默认就是这种方式, 会 ...

  4. Mybatis Plugin插件安装破解及使用

    2018年2月更新 2018年2月份,提供一个网上比较多的一个版本V3.21版本,下载资源里面有个已整合版直接解压放入C:\Users\你的用户名\.IntelliJIdea2017.3\config ...

  5. 阿里云将centos 7 自带的 php 5.4升级为 5.6

    1.php -v PHP 5.4.16 (cli) (built: Nov 6 2016 00:29:02) Copyright (c) 1997-2013 The PHP Group Zend En ...

  6. OpenJudge 2727 仙岛求药

    总时间限制:  1000ms 内存限制:  65536kB 描述 少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶.叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发 ...

  7. Use ASP.NET and DotNetZip to Create and Extract ZIP Files

    原文发布时间为:2011-02-16 -- 来源于本人的百度文章 [由搬家工具导入] Published: 11 Feb 2011By: Scott MitchellDownload Sample C ...

  8. transform与position:fixed的那些恩怨

    1. 前言 在写这篇文章之前,我理解的fixed元素是这样的:(摘自CSS布局基础) 固定定位与absolute定位类型类似,但它的相对移动的坐标是视图(屏幕内的网页窗口)本身.由于视图本身是固定的, ...

  9. Spring Boot学习——表单验证

    我觉得表单验证主要是用来防范小白搞乱网站和一些低级的黑客技术.Spring Boot可以使用注解 @Valid 进行表单验证.下面是一个例子. 例子说明:数据库增加一条Student记录,要求学生年龄 ...

  10. qemu相关命令使用

    qemu-ga qemu-guest-agent-2.5.0-3.el7.x86_64 qemu-img qemu-img-1.5.3-105.el7_2.4.x86_64 qemu-io qemu- ...