30 Foundation框架之NSKeyedArchiver和NSKeyedUnarchiver
来源:互联网 发布:左耳最后说了什么 知乎 编辑:程序博客网 时间:2024/06/03 08:51
30 Foundation框架之NSKeyedArchiver和NSKeyedUnarchiver
Tags: Objective-C
NSKeyedArchiver表示归档,表示把对象转换为可保存可传输的数据流,通常可以是文件或者URL。
NSKeyedUnarchiver表示恢复归档,表示从数据流中恢复对象。
NSKeyedArchiver和NSKeyedUnarchiver有两种使用方式,第一种是使用类方法创建将对象当成root进行归档和恢复,代码示例如下:
test1.m
#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) { @autoreleasepool { NSDictionary *dict1 = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:89], @"C++", [NSNumber numberWithInt:79], @"C", [NSNumber numberWithInt:69], @"Java", [NSNumber numberWithInt:59], @"Swift",nil]; //使用NSKeyedArchiver的类方法进行归档 [NSKeyedArchiver archiveRootObject:dict1 toFile:@"/Users/Ralf/Desktop/myDict.archive"];//归档至文件中 NSData *dataArchive = [NSKeyedArchiver archivedDataWithRootObject:dict1];//归档至Data中 //使用NSKeyedUnarchiver的类方法恢复归档中的对象 NSDictionary *dict20 = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/Ralf/Desktop/myDict.archive"];//从文件中恢复对象 NSDictionary *dict21 = [NSKeyedUnarchiver unarchiveObjectWithData:dataArchive];//从NSData中恢复对象 NSLog(@"C++对应的value为:%@", [dict20 valueForKey:@"C++"]); NSLog(@"C对应的value为:%@", [dict20 valueForKey:@"C"]); NSLog(@"Java对应的value为:%@", [dict20 valueForKey:@"Java"]); NSLog(@"Swift对应的value为:%@", [dict20 valueForKey:@"Swift"]); NSLog(@"C++对应的value为:%@", [dict21 valueForKey:@"C++"]); NSLog(@"C对应的value为:%@", [dict21 valueForKey:@"C"]); NSLog(@"Java对应的value为:%@", [dict21 valueForKey:@"Java"]); NSLog(@"Swift对应的value为:%@", [dict21 valueForKey:@"Swift"]); } return 0;}
运行结果:
C++对应的value为:89C对应的value为:79Java对应的value为:69Swift对应的value为:59C++对应的value为:89C对应的value为:79Java对应的value为:69Swift对应的value为:59
当需要归档、恢复某个自定义类的对象的实例时,那么该类必须实现<NSCoding>
协议,也即在类的实现部分必须实现该协议的如下两个方法:
1. initWithCoder:
:该方法负责恢复对象,在该方法中要恢复该对象的所有实例变量
2. encodeWithCoder:
:该方法负责归档该对象,在该方法中要归档该对象的所有实例变量
如果针对一些基础数据类型时,该怎么归档和恢复呢?OC提供了如下方法:
代码示例如下:
GKHApple.h
#import <Foundation/Foundation.h>@interface GKHApple : NSObject <NSCoding>@property (nonatomic, copy) NSString *color;@property (nonatomic, assign) double weight;@property (nonatomic, assign) int size;- (id) initWithColor:(NSString *)color weight:(double)weight size:(int)size;@end
GKHApple.m
#import "GKHApple.h"@implementation GKHApple- (id) initWithColor:(NSString *)color weight:(double)weight size:(int)size { if (self = [super init]) { self.color = [color copy]; self.weight = weight; self.size = size; } return self;}- (NSString *) description { return [NSString stringWithFormat:@"<GKHApple[_color=%@, _weight=%g, _size=%d]>", self.color, self.weight, self.size];}//实现该类的对象的归档方法- (void) encodeWithCoder:(NSCoder *)aCoder { //调用NSCoder的方法归档对象的每个实例变量 [aCoder encodeObject:_color forKey:@"color"]; [aCoder encodeDouble:_weight forKey:@"weight"]; [aCoder encodeInt:_size forKey:@"size"];}//实现该类的对象的恢复归档的方法- (id) initWithCoder:(NSCoder *)aDecoder { //调用NSCoder的方法恢复归档到对象的每个实例变量 [aDecoder decodeObjectForKey:@"color"]; [aDecoder decodeDoubleForKey:@"weight"]; [aDecoder decodeIntForKey:@"size"]; return self;}@end
test2.m
#import <Foundation/Foundation.h>#import "GKHApple.h"int main(int argc, const char * argv[]) { @autoreleasepool { NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:89], @"C++", [NSNumber numberWithInt:79], @"C", [NSNumber numberWithInt:69], @"Java", [NSNumber numberWithInt:59], @"Swift",nil]; NSSet *set = [NSSet setWithObjects:@"C++编程", @"C编程", @"Java编程", @"Swift编程", nil]; GKHApple *apple = [[GKHApple alloc] initWithColor:@"red" weight:3.4 size:20]; //创建一个NSMutableData用来保存归档的数据 NSMutableData *data = [NSMutableData data]; //①使用NSKeyedArchiver的实例方法创建归档 NSKeyedArchiver *arch = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data]; //②重复调用encodeObject:forKey:方法归档所有需要归档的对象 [arch encodeObject:dict forKey:@"myDict"]; [arch encodeObject:set forKey:@"mySet"]; [arch encodeObject:apple forKey:@"myApple"]; //③结束归档 [arch finishEncoding]; //将归档的NSMutableData的数据写入文件 if ([data writeToFile:@"multi.archive" atomically:YES] == NO) { NSLog(@"归档失败"); } //创建一个NSData用来读取指定文件的归档数据 NSData *data1 = [NSData dataWithContentsOfFile:@"multi.archive"]; //①使用NSKeyedUnarchiver的实例方法创建解归档对象 NSKeyedUnarchiver *unarch = [[NSKeyedUnarchiver alloc]initForReadingWithData:data1]; //②重复调用decodeObjectForKey:方法恢复归档中的对象 [unarch decodeObjectForKey:@"myDict"]; [unarch decodeObjectForKey:@"mySet"]; [unarch decodeObjectForKey:@"myApple"]; //③结束解归档 [unarch finishDecoding]; NSLog(@"%@", dict); NSLog(@"%@", set); NSLog(@"%@", apple); } return 0;}
运行结果为:
{ C = 79; "C++" = 89; Java = 69; Swift = 59;}{( "Java\U7f16\U7a0b", "Swift\U7f16\U7a0b", "C++\U7f16\U7a0b", "C\U7f16\U7a0b")}<GKHApple[_color=red, _weight=3.4, _size=20]>
0 0
- 30 Foundation框架之NSKeyedArchiver和NSKeyedUnarchiver
- Foundation--NSKeyedArchiver与NSKeyedUnarchiver
- foundation——NSCoding NSKeyedArchiver NSKeyedUnarchiver
- iOS开发之归档(NSKeyedArchiver)和反归档(NSKeyedUnarchiver)
- IOS持久化之NSKeyedArchiver,NSKeyedUnarchiver
- 使用NSKeyedArchiver归档和NSKeyedUnarchiver读档
- NSCoding NSKeyedArchiver NSKeyedUnarchiver
- ios数据存储之--对模型对象归档(NSKeyedArchiver、NSKeyedUnarchiver)
- ios数据存储之--对模型对象归档(NSKeyedArchiver、NSKeyedUnarchiver)
- ios数据存储之--对模型对象归档(NSKeyedArchiver、NSKeyedUnarchiver)
- ios数据存储之--模型对象归档(NSKeyedArchiver、NSKeyedUnarchiver)
- ios:NSKeyedArchiver/NSKeyedUnarchiver(归档/解档)
- iOS开发-进阶:数据存储之-对模型对象归档(NSKeyedArchiver、NSKeyedUnarchiver)
- ios开发学习笔记--数据持久化之归档解档(NSKeyedArchiver/ NSKeyedUnarchiver)
- IOS之Core Foundation框架和Cocoa Foundation框架区别
- IOS之Core Foundation框架和Cocoa Foundation框架区别
- IOS之Core Foundation框架和Cocoa Foundation框架区别
- NSKeyedArchiver、NSKeyedUnarchiver 数据持久化归档
- 26 使用NSPathUtilities.h管理路径
- BMP位图信息·DIB结构
- 27 Foundation框架之NSProcessInfo
- 28 Foundation框架之NSFileHandle
- 29 Foundation框架之NSURL
- 30 Foundation框架之NSKeyedArchiver和NSKeyedUnarchiver
- EventBus使用详解
- HDU-2086(推一下公式)
- mac androidstudio 无法连接魅蓝手机进行调试
- Parcelable接口的使用
- 监听器(Listener)学习
- LeetCode OJ 系列之118 Pascal's Triangle --Python
- LeetCode OJ 系列之73 Set Matrix Zeroes --Python
- LeetCode OJ 系列之66 Plus One --Python