• 数组的归档
  • 对象的归档
  • 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. linux系统——机制与策略(三)

    机制与策略 学习系统调用时,书上提到机制与策略,这也是陈老师与武特学长经常给我们强调的,这是一种设计模式,帮助我们理解操作系统的设计.下面的内容是从陈莉君老师的博客上copy下来的,写的很好,很通俗. ...

  2. 刷题总结——飞飞侠(bzoj2143 最短路)

    题目: Description 飞飞国是一个传说中的国度,国家的居民叫做飞飞侠.飞飞国是一个N×M的矩形方阵,每个格子代表一个街区.然而飞飞国是没有交通工具的.飞飞侠完全靠地面的弹射装置来移动.每个街 ...

  3. MFC 对话框阴影效果

    在 OnInitDialog(Cdialog)里面添加 SetClassLong(this->m_hWnd, GCL_STYLE, GetClassLong(this->m_hWnd, G ...

  4. Do not use built-in or reserved HTML elements as component id: header

    刚刚在搭建项目时发现控制台报错 查找发现是因为组件名称所致,也就是当我们起名一个header.vue的组件时,我们安装的vue插件会自动把name设置为default 这就造成了错误 把header修 ...

  5. node系列

    http://www.cnblogs.com/zhongweiv/p/nodejs.html

  6. 让python和C/C++联姻【转】

    python不在孤单,轻易而举的为python写C/C++第三方库. 我们都知道python很慢,特别是处理大数据的时候,简直慢到极致,如果在知道代码的瓶颈的时候,可以将需要大量计算的数据块放在C/C ...

  7. form快速转json serialize

    原文发布时间为:2011-03-28 -- 来源于本人的百度文章 [由搬家工具导入] <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tran ...

  8. 【程序打包工具 Inno Setup】转

    原文转自 https://jingyan.baidu.com/article/36d6ed1f50ecfc1bcf4883aa.html

  9. onCreate、onStart、onResume、onPause、onStop、onDestory(转)

    程序正常启动:onCreate()->onStart()->onResume();正常退出:onPause()->onStop()->onDestory() 一个Activit ...

  10. 深入代码详谈irqbalance【转】

    转自:http://blog.csdn.net/whrszzc/article/details/50533866 版权声明:本文为博主原创文章,未经博主允许不得转载. 深入代码详谈irqbalance ...