• 数组的归档
  • 对象的归档
  • 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. JavaScript 笔记(2) -- 类型转换 & 正则表达 & 变量提升 & 表单验证

    目录:  typeof, null, undefined, valueOf() 类型转换 正则表达式 错误: try, catch, throw 调试工具 变量提升 strict 严格模式 使用误区 ...

  2. Bzoj1195 [HNOI2006]最短母串 [状态压缩]

    Time Limit: 10 Sec  Memory Limit: 32 MBSubmit: 1304  Solved: 439 Description 给定n个字符串(S1,S2,„,Sn),要求找 ...

  3. Vijos P1404 遭遇战

    背景 你知道吗,SQ Class的人都很喜欢打CS.(不知道CS是什么的人不用参加这次比赛). 描述 今天,他们在打一张叫DUSTII的地图,万恶的恐怖分子要炸掉藏在A区的SQC论坛服务器!我们SQC ...

  4. 【BZOJ1874】取石子游戏(SG函数)

    题意:小H和小Z正在玩一个取石子游戏. 取石子游戏的规则是这样的,每个人每次可以从一堆石子中取出若干个石子, 每次取石子的个数有限制,谁不能取石子时就会输掉游戏. 小H先进行操作, 他想问你他是否有必 ...

  5. android基本控件学习-----SeekBar&RatingBar

    SeekBar(拖动条)和RatingBar(星级评分条)讲解 一.SeekBar(拖动条) (1)拖动条简单理解就是可以拖动的线,这个对我们来讲很常见,比如视频播放或者音乐播放我们拖动播放的进度,下 ...

  6. Selenium2+python自动化1(环境安装)

    前言 目前selenium版本已经升级到3.0了,网上的大部分教程是基于2.0写的,所以在学习前先要弄清楚版本号,这点非常重要.本系列依然以selenium2为基础,目前selenium3坑比较多,暂 ...

  7. C# List排序,附加使用Linq排序

    首先先介绍一下平时最常用的几种排序方法. 第一种:实体类实现IComparable接口,而且必须实现CompareTo方法 实体类定义如下: class Info:IComparable { publ ...

  8. C# 加载图片image --(C#)Image.FromFile 方法会锁住文件的原因及可能的解决方法

    Image.FromFile 一旦使用后,对应的文件在一直调用其生成的Image对象被Disponse前都不会被解除锁定,这就造成了一个问题,就是在这个图形被解锁前无法对图像进行操作(比如删除,修改等 ...

  9. jdbc in postgres

    try { Class.forName("org.postgresql.Driver").newInstance(); String url = "jdbc:postgr ...

  10. Codeforces Gym100735 D.Triangle Formation (KTU Programming Camp (Day 1) Lithuania, Birˇstonas, August 19, 2015)

    日常训练题解 D.Triangle Formation You are given N wooden sticks. Your task is to determine how many triang ...