iOS - OC NSKeyedArchiver 数据归档
前言
@interface NSKeyedArchiver : NSCoder
@interface NSKeyedUnarchiver : NSCoder
在 OC 语言中,归档是一个过程,即用某种格式来保存一个或多个对象,以便以后还原这些对象。通常,这个过程包括将(多个)对象写入文件中,以便以后读取该对象。可以使用归档的方法进行对象的深复制。
采用归档的形式来保存数据,该数据对象需要遵守 NSCoding 协议,并且该对象对应的类必须提供 encodeWithCoder: 和 initWithCoder: 方法。前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码。
缺点:归档的形式来保存数据,只能一次性归档保存以及一次性解压。所以只能针对小量数据,而且对数据操作比较笨拙,即如果想改动数据的某一小部分,还是需要解压整个数据或者归档整个数据。
iOS 实现的序列化方式的两种:NSKeyedArchiver,NSPropertyListSerialization。在这两种序列化方式中,NSData 都是序列化的目标。两种方式的不同点在于 NSPropertyListSerialization 是针对数组和字典类型的,而 NSKeyedArchiver 是针对对象的。
1、系统类的归档/反归档
// 文件路径
NSString *achiverPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/stringAchiverFile"];
// 待归档的数据
NSString *string = @"bei jing huan yin nin";
// 归档,归档到文件
bool bl = [NSKeyedArchiver archiveRootObject:string toFile:achiverPath];
// 反归档,从文件反归档
NSString *strFromAchiverFile = [NSKeyedUnarchiver unarchiveObjectWithFile:achiverPath];
2、自定义类的归档和反归档
Dog.h
// 遵守 NSCoding 协议
@interface Dog : NSObject <NSCoding> @property (nonatomic, assign)int age;
@property (nonatomic, copy)NSString *name; + (Dog *)dogWithName:(NSString *)name andAge:(int)age; @end
Dog.m
// 实现 NSCoding 协议方法
@implementation Dog // 归档 方法,使用编码器将对象编码成二进制数据流,归档(持久化存储)
- (void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeInt:self.age forKey:@"age"];
[aCoder encodeObject:self.name forKey:@"name"];
} // 反归档 方法,将保存在磁盘上的二进制数据流,解码成 OC 对象
- (id)initWithCoder:(NSCoder *)aDecoder{ self.age = [aDecoder decodeIntForKey:@"age"];
self.name = [aDecoder decodeObjectForKey:@"name"]; return self;
} @end
main.m
#import "Dog.h" // 文件路径
NSString *achiverPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/dogAchiverFile"]; Dog *dog = [Dog dogWithName:@"xiao hei" andAge:5]; // 归档 // 归档到文件
BOOL bl = [NSKeyedArchiver archiveRootObject:dog toFile:achiverPath]; // 反归档 // 从文件反归档
Dog *dogFromAchiverFile = [NSKeyedUnarchiver unarchiveObjectWithFile:achiverPath];
3、NSKeyedArchiver 序列化
main.m
// Cat 类不需要遵守 NSCoding 协议,也不需要其协议方法
#import “Cat.h” // 文件路径
NSString *achiverPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/catAchiverFile"]; // 归档,编码 Cat *cat1 = [Cat catWithName:@"xiao bai" andAge:2]; // 设置数据区域
NSMutableData *achiverDataArea = [NSMutableData data]; // 开始存储对象,编码 // 将数据区域链接到 NSKeyedArchiver 对象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:achiverDataArea]; // 可以存储类的实例变量
[archiver encodeObject:cat1.name forKey:@"name"]; // 编码完成
[archiver finishEncoding]; // 将存档的数据写入文件
BOOL bl = [achiverDataArea writeToFile:achiverPath atomically:YES]; // 反归档,解码 Cat *cat2 = [[Cat alloc] init]; // 设置数据区域
NSData *unarchiverDataArea = [NSData dataWithContentsOfFile:achiverPath]; // 解码存储在归档文件中的对象 // 将数据区域链接到 NSKeyedUnarchiver 对象
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:unarchiverDataArea]; // 解码
cat2.name = [unarchiver decodeObjectForKey:@"name"]; // 解码完成
[unarchiver finishDecoding];
iOS - OC NSKeyedArchiver 数据归档的更多相关文章
- iOS - Swift NSKeyedArchiver 数据归档
前言 public class NSKeyedArchiver : NSCoder public class NSKeyedUnarchiver : NSCoder 在 OC 语言中,归档是一个过程, ...
- NSKeyedArchiver数据归档
前言 在 OC 语言中,归档是一个过程,即用某种格式来保存一个或多个对象,以便以后还原这些对象. 通常,这个过程包括将(多个)对象写入文件中,以便以后读取该对象.可以使用归档的方法进行对象的深复制. ...
- iOS - OC PList 数据存储
前言 直接将数据写在代码里面,不是一种合理的做法.如果数据经常改,就要经常翻开对应的代码进行修改,造成代码扩展性低.因此,可以考虑将经常变的数据放在文件中进行存储,程序启动后从文件中读取最新的数据.如 ...
- iOS - OC NSUserDefaults 数据存储
前言 @interface NSUserDefaults : NSObject 用来保存应用程序设置和属性.用户保存的数据.用户再次打开程序或开机后这些数据仍然存在.如果往 userDefaults ...
- iOS - OC NSData 数据
前言 @interface NSData : NSObject <NSCopying, NSMutableCopying, NSSecureCoding> @interface NSMut ...
- iOS开发 - 数据归档与恢复 NSKeyedArchiver
归档与恢复归档 归档,英文Archiver['ɑrkɪvə],这里指的是将OC的对象存储为一个文件或者网络上的一个数据块. 恢复归档.英文UnArchiver,指的是将一个来自文件或网络的归档数据块恢 ...
- IOS NSKeyedArchiver(归档存取数据)
如果对象是NSString.NSDictionary.NSArray.NSData.NSNumber等类 型,可以直接用NSKeyedArchiver进行归档和恢复 不是所有的对象都可以直接用这种方法 ...
- iOS - OC 数据持久化
1.Sandbox 沙箱 iOS 为每个应用提供了独立的文件空间,一个应用只能直接访问为本应用分配的文件目录,不可以访问其他目录,每个应用自己独立的访问空间被称为该应用的沙盒.也就是说,一个应用与文件 ...
- ios开发之数据存储
iOS应用数据存储的常用方式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core Data 应用沙盒 ...
随机推荐
- PHP面向对象的一些深入理解
1.$this就是这个对象的地址,$this不能在类外部使用.2.构造函数 __construct 和析构函数都没有返回值:一旦一个对象成为垃圾对象(没有任何变量引用的对象,或者=null),析构函数 ...
- SDUT 2877:angry_birds_again_and_again
angry_birds_again_and_again Time Limit: 2000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 The problems ...
- java中@value的环境配置
@value 在现阶段我想大家对注解都不陌生,@value的用法就是在后台获取配置文件的信息,从而方便修改一些固定的配置.不明白的可以百度@value的详解. 配置@value有以下几个步骤. 1.首 ...
- 网络编程中获取域名和id的方法
package com.lanqiao.java.test; import java.net.InetAddress;import java.net.UnknownHostException; pub ...
- poj2269 Friends
计算表达式. 只有3种运算符:*,+,- , *优先级高于后两者,后两者优先级相同. 有两种符号:{},(). 利用递归和堆栈即可解决. 首先遇到左括号开始入栈直到遇到右括号,遇到右括号时对括号内的数 ...
- ip地址定位库
ip2region 1.2.1 发布了,新增 Python 内存查询+数据文件更新. 准确率99.9%的ip地址定位库,0.0x毫秒级查询,数据库文件大小只有1.5M,提供了java, php, c, ...
- Java多线程的三种实现方式
java多线程的三种实现方式 一.继承Thread类 二.实现Runnable接口 三.使用ExecutorService, Callable, Future 无论是通过继承Thread类还是实现Ru ...
- linux学习建议
给初学者的建议 注意事项: 1 严格区分大小写,包括命令和文件夹,windows和linux的系统不太一样 2 所有内容都是以文件保存,包括硬件,文件要永久生效,都要写入文件,所以文件命令很重要 3 ...
- zoj 3557 How Many Sets II
How Many Sets II Time Limit: 2 Seconds Memory Limit: 65536 KB Given a set S = {1, 2, ..., n}, n ...
- nylg 640 Geometric Sum
Geometric Sum 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 Compute (a + a^2 + … + a^n) mod m.(a+a2+…an)m ...