oc自学-归档

归档是一个过程,即用魔咒格式来保存一个或多个对象,以便以后还原这些对象。通常,这个过程包括将(多个)对象写入文件中,以便以后读取该对象。

属性列表和带键值的编码。


使用XML属性列表进行归档

Mac OS X上的应用程序使用XML属性列表(或plists)存储诸如默认参数选择、应用程序选择和配置信息这样的数据。然而,这些列表的归档用途是有限的,因为当为某个数据结构创建属性列表时,并没有保存特定的对象类,也没有存储对同一个对象的多个引用,也没有保持对象的可变性。

NSDictionary *glossary = @{
	@"abstract class": @"A class",
	@"adopt": @“To implement all”
}
if ([glossary writeToFile: @"glossary" atomically: YES] == NO)
	NSLog(@"Save to file failed!");


writToFile:atomically: 消息发送给字典glossary,使字典以属性列表的形式写到文件glossary中。atomically参数设为YES,表示希望首先将字典写入临时备份文件中,并且一旦成功,将把最终数据转移到名为glossary的指定文件中。它保护文件在一些情况下(如系统在执行操作的过程中崩溃)免受破坏。原始的glossary文件不会受到损害。

若要将文件中的XML属性列表读入你的程序,使用dictionaryWithContentsOfFile:或者arrayWithContentsOfFile:方法。要读取数据,使用dataWithContentsOfFile:方法;要读取字符串对象,使用stringWithContentsOFFile:方法。

NSDictionary *glossary;
glossary = [NSDictionary dictionaryWithContentsOfFile: @"glossary"];
for (NSString *key in glossary)
	NSLog(@"%@: %@",key,glossary[key]);


使用NSKeyedArchiver归档

在带键的档案中,每个归档字段都有一个名称。归档某个对象,会为它提供一个名称,即键。从归档中获取该对象,是根据这个键来检索它的。这样,可以按照任意顺序将对象写入归档并进行检索。

NSDictionary *glossary = @{
};
[NSKeyedArchiver archiveRootObject: glossary toFile: @"glossary.archive"];

NSDictionary *glossary1;
glossary1 = [NSKeyedArchiver unarchiveObjectWithFile: @"glossary.archive"];//将指定的文件打开读取文件的内容,该文件必须是前面归档操作的结果。
for (NSString *key in glossary)
	NSLog(@"%@: %@",key,glossary[key]);

编码方法和解码方法

并不能直接使用这种方法归档AddressBook,要归档前面没有列出的对象,必须告知系统如何归档(编码)你的对象,以及如何解归档(解码)它们。按照<NSCoding>协议,在类定义中添加encodeWithCoder:方法和initWithCoder:方法实现的。

每次归档程序想要根据指定的类编码对象时,都将调用encodeWithCoder:方法,该方法告知归档程序如何进行归档。每次解码,都会调用initWithCoder:方法。

基本Oc类,可以使用encodeObject:forKey:方法。基本的c数据类型,使用encodeBool:forKey:和decodeBool:forKey:。P440

@import <Foundation/Foundation.h>
@interface AddressCar: NSObject<NSCoding,NSCopying>
@property (cpoy,nonatomic) NSString *name, *email;
-(void) setName: (NSString *) theName andEmail: (NSString *) theEmail;
-(NSComparisonResult) compareNames: (id) element;
-(void) print;
//添加NSCopying协议的方法
-(void) assignName: (NSString *) theName andEmail: (NSString *) theEmail
@end
-(void) encodeWithCoder: (NSCoder *) encoder
{
	[encoder encodeObject: name forKey: @"AddressCardName"];
	[encoder encodeObject: email forKey: @"AddressCardEmail"];
}
-(id) initWithCoder: (NSCoder *) decoder
{
	name = [decode decodeObjectforKey: @"AddressCardName"];
	email = [decode decodeObjectforKey: @"AddressCardEmail"];
	return self;
}

使用NSData创建自定义档案

NSData对象可以用来保留一块内存空间,以备将来存储数据。这些数据空间的典型应用是为了一些数据提供临时存储空间,以便随后写入文件,或存放从磁盘读取的文件内容。

<pre name="code" class="objc">dataArea = [NSMutableData data];
	该语句创建一个空缓存区,其大小将随着程序执行的需要而扩展。
Foo *myFool = [[Foo alloc] init];
NSMutableData *dataArea;
NSKeyedArchiver *archiver;
AddressBook *myBook;
//设置数据区,并将其连接到一个NSKeyedArchiver对象
dataArea = [NSMutableData data];
archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData: dataArea];<span style="white-space:pre">	</span>//指定要写入归档数据的存储空间。

//现在可以开始存储对象
[archiver encodeObject: myBook forKey: @"myaddrbook"];
[archiver encodeObject: myFool forKey: @"myfool"];
[archiver finishEncoding];<span style="white-space:pre">							</span>//收到finishEncoding消息前,所有的编码消息都被归档并存储在指定的数据控件内

//将存储的数据区写到文件中
if ([dataArea writeToFile: @"myArchive" atomically: YES] == NO) 
	NSLog(@"Archiver failed!");
 

解码:首先,分配数据空间;其次,把档案文件中的数据读入该数据空间;然后,创建一个NSKeyedUnArchiver对象,并指定空间。finishDecoding。

NSData *dataArea;
NSKeyedUnarchiver *unarchiver;
Foo *myFool;
AddressCard *myBook;

dataArea = [NSData dataWithContentsOfFile: @"myArchiver"];
if(! dataArea){
	NSLog(@"Can`t read back archiver file");
	return1;
}
unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData: dataArea];

myBook = [unarchiver decodeObjectForKey: @"myaddrbook"];
myFool = [unarchiver decodeObjectForKey: @"myfool"];
[unarchiver finishDecoding];

使用归档程序复制对象

使用Foundation的归档功能来创建对象的深复制。dataArray归档到一个缓冲区,然后把它解归档,将结果指派给dataArray2,从而将dataArray复制给dataArray2。不需要使用文件,归档和解归档过程都可以在内存中发生。

NSData *data;
NSMutableArray *dataArray = [NSMutableArray arrayWithObjects:
	[NSMutableString stringWithString: @"one"],
	[NSMutableString stringWithString: @"two"],
	nil
];
NSMutableArray *dataArray2;
NSMutableString *mStre;

//使用归档器进行深复制
data = [NSKeyedArchiver archiverDataWithRootObject: dataArray];
dataArray2 = [NSKeyedUnarchiver unarchiverObjectWithData: data];
//dataArray2 = [NSKeyedUnarchiver unarchiverObjectWithData: [NSKeyedArchiver archiverDataWithRootObject: dataArray]];

mStr = dataArray2[0]
[mStr appendString: @"ONE"];



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值