• 数组的归档
  • 对象的归档
  • 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. 求职之路(拿到百度、美团、趋势科技、华为offer)

    求职之路(拿到百度.美团.趋势科技.华为offer) 版权所有:无缰之马chhuach(CSDN和博客源),转载请注明出处.CSDN地址http://blog.csdn.net/chhuach2005 ...

  2. docke存储

    1.Docker提供三种不同的方式将数据从宿主机挂载到容器中:volumes,bind mounts和tmpfs.volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker ...

  3. live-server 快速搭建静态服务

    作为切图仔呢,平时都是在修改页面样式.展示后台返回的数据.调试js效果,这时候呢就需要搭一个服务器以便我们调试.平时我一般用的都是wamp,在www目录下新建项目然后开始撸代码,不过有时候呢不太方便, ...

  4. spoj 8222 NSUBSTR 求长度为x的子串中出现次数最大值 SAM

    题目大意 给一个字符串S 令F(x)表示S的所有长度为x的子串中 出现次数的最大值. 求F(1)..F(Length(S)) 分析 一个节点\(x\)的长度有\(~~(max(fa),max(x)]\ ...

  5. [LeetCode] Sum Root to Leaf Numbers dfs,深度搜索

    Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number ...

  6. hdu 5950 Recursive sequence 递推式 矩阵快速幂

    题目链接 题意 给定\(c_0,c_1,求c_n(c_0,c_1,n\lt 2^{31})\),递推公式为 \[c_i=c_{i-1}+2c_{i-2}+i^4\] 思路 参考 将递推式改写\[\be ...

  7. Nginx修改版本信息或隐藏版本号

    一,隐藏版本号.首先说明,这个是某一方面隐藏,不是彻底隐藏.未隐藏之前查看nginx信息: 隐藏方法: 修改nginx.conf配置文件,在http { } 标签里边加入字段: server_toke ...

  8. Linux系统日常运维-修改IP地址

    分享下高手写的很好的文章 IP地址.子网掩码.网络号.主机号.网络地址.主机地址 step 0: check the iptables.selinux service iptables iptable ...

  9. openshift scc解析

    SCC使用UserID,FsGroupID以及supplemental group ID和SELinux label等策略,通过校验Pod定义的ID是否在有效范围内来限制pod的权限.如果校验失败,则 ...

  10. 关于npm无法安装依赖包以及安装包缓慢的解决方法

    因为npm的服务器在国外,导致我们使用npm安装第三方包缓慢.而且有的第三方包是被墙的. 因此,作为墙内人,必须解决这个问题,否则开发起来实在是太坑了! 推荐大家使用淘宝的镜像(cnpm),它以每10 ...