iOS归档存储数据

本文介绍了如何使用NSKeyedArchiver和NSKeyedUnarchiver进行对象的序列化与反序列化,通过示例展示了如何保存和加载自定义类Restaurant的对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做Archiving. 二进制流可以通过网络或写入文件中

例:NSKeyedArchiver
========================================================*/
NSString *str = @”abc”;
NSString *astr = @”efg”;
NSArray *Array = [NSArray arrayWithObjects:str, astr, nil];

//保存数据
NSString *Path = [NSSearchPathForDirectori<wbr><wbr></wbr>esInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];</wbr>

NSString *filename = [Path stringByAppendingPathCom<wbr><wbr></wbr>ponent:@"test"];<br> [NSKeyedArchiver archiveRootObject:Array<wbr>toFile:filename];</wbr></wbr>

str = @”a”;
astr = @”";

//加载数据
NSArray *arr = [NSKeyedUnarchiver<wbr>unarchiveObjectWithFile: filename];<br> str = [arr objectAtIndex:0];<br> astr =<wbr><wbr></wbr><wbr><wbr></wbr>[arr objectAtIndex:1];</wbr></wbr></wbr>

NSLog(@”str:%@”,str);
NSLog(@”astr:%@”,astr);

2、在nsstring 的类的定义中已经添加了协议 即他是实现了nscoding 代理的方法的。

@interface NSString : NSObject

NScoding 是一个协议,主要有下面两个方法

-(id)initWithCoder:(NSCoder *)coder;//从coder中读取数据,保存到相应的变量中,即反序列化数据

-(void)encodeWithCoder:(NSCoder *)coder;// 读取实例变量,并把这些数据写到coder中去。序列化数据

NSCoder 是一个抽象类,抽象类不能被实例话,只能提供一些想让子类继承的方法。

NSKeyedUnarchiver<wbr><wbr></wbr><wbr><wbr></wbr><wbr>从二进制流读取对象。</wbr></wbr></wbr>

NSKeyedArchiver<wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>把对象写到二进制流中去。</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

一般是在自己定义的类中需要在.h 文件中加入

在.m 文件众实现他的的两个代理方法,这个代理方法将会被自动调用

例如对一个数据类的封装如下:

@interface Restaurant : NSObject {
<wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>NSString* shopID;<wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>NSString* title;<wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>NSString* discount;<wbr><wbr></wbr><br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>NSString* address;<wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><br> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

@property (nonatomic, copy) NSString *shopID;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *discount;
@property (nonatomic, copy) NSString *address;
@end

@implementation Restaurant
@synthesize shopID,title,discount,address;
-(void)dealloc
{
<wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>[shopID release];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>[title release];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>[discount release];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>[address release];<br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>[super dealloc];<wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><br> }<br></wbr></wbr></wbr></wbr></wbr></wbr>

- (id)initWithCoder:(NSCoder *)coder
{
<wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>if (self = [super init]) {<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>shopID = [[coder decodeObjectForKey:@"shopid"] retain];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>title<wbr><wbr></wbr><wbr>= [[coder decodeObjectForKey:@"title"] retain];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>discount=[[coder decodeObjectForKey:@"discount"] retain];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>address=[[coder decodeObjectForKey:@"address"] retain]; <wbr><wbr></wbr><wbr><wbr></wbr><br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>}<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>return self;<br> }<br><br> -(void)encodeWithCoder:(NSCoder *)coder<br> {<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>[coder encodeObject:shopID forKey:@"shopid"];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>[coder encodeObject:title forKey:@"title"];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>[coder encodeObject:discount forKey:@"discount"];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>[coder encodeObject:address forKey:@"address"];<wbr><wbr></wbr><br> }<br> @end</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

下一步就是保存和加载数据了:

注:history对象是一个NSMutableArray数组,用来装Restaurant对象。

-(void) saveArchiver<wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>//保存<br> {</wbr></wbr></wbr></wbr></wbr>

<wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>//获取路径和保存文件<br></wbr></wbr></wbr>

<wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>NSArray<wbr><wbr></wbr><wbr>*paths = NSSearchPathForDirectori<wbr><wbr></wbr>esInDomains(NSDocumentDirectory, NSUserDomainMask, YES);<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>NSString* filename = [[paths objectAtIndex:0] stringByAppendingPathCom<wbr><wbr></wbr>ponent:@"history.dat"];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>if (history &amp;&amp; [history count]&gt;0) {<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>[NSKeyedArchiver archiveRootObject:history<wbr>toFile:filename];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>}else {<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>//删除归档文件<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>NSFileManager<wbr>*defaultManager = [NSFileManager defaultManager];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>if ([defaultManager isDeletableFileAtPath:filename]) {<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>[defaultManager removeItemAtPath:filename error:nil];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>}<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>}<br> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

-(void) loadArchiver<wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>//加载<br> {<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>NSArray<wbr><wbr></wbr><wbr>*paths = NSSearchPathForDirectori<wbr><wbr></wbr>esInDomains(NSDocumentDirectory, NSUserDomainMask, YES);<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>NSString* filename = [[paths objectAtIndex:0] stringByAppendingPathCom<wbr><wbr></wbr>ponent:@"history.dat"];<br><wbr><wbr></wbr><wbr><wbr></wbr><wbr><wbr></wbr><wbr>self.history= [NSKeyedUnarchiver<wbr>unarchiveObjectWithFile:filename];<br> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值