在Object-C术语中,归档是指用某种格式来保存一个或多个对象,以便以后还原这些对象的过程。通常,这个过程包括将(多个)对象写入文件中,以便以后读回该对象。
归档数据主要有两种方法:属性列表和带键值的编码。
Mac OS X上的应用程序使用XML属性列表(或plists)来存储诸如默认参数选择、应用程序设置和配置信息这样的数据。因此,了解如何创建和读回这些数据是很有用的。然而,这些列表的归档用途是有限的,因为当某个数据结构创建属性列表时,没有保存特定的对象类,没有存储对同一对象的多个引用,也没有保持对象的可变性。
如果你的对象时NSString、NSDictionary、NSArray、NSData或NSNumber对象,你可以使用在这些类中实现的writeToFile:atomically:方法将数据写到文件中。在写出某个字典或者数组的情况下,该方法可以使用XML属性列表的格式写出数据。
下面的例子显示了如何将字典作为属性列表写入文件中,然后读取到新的字典对象中,输出显示到控制台上:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
//创建字典作为属性列表写入文件
NSDictionary *glossary = [NSDictionary dictionaryWithObjectsAndKeys:
@"A class defined so other class can inherit from it.",@"abstract class",
@"To implement all the methods defined in a protocol.",@"adopt",
@"Storing an object for later use.",@"archiving",
nil
];
if([glossary writeToFile:@"glossary" atomically:YES] == NO)
NSLog(@"Save to file failed!");
//从文件中读取数据,存入字典并输出
NSDictionary *readgloss;
readgloss = [NSDictionary dictionaryWithContentsOfFile:@"glossary"];
for(NSString *key in readgloss)
NSLog(@"%@: %@",key,[readgloss objectForKey:key]);
}
return 0;
}
代码分析:
其中writeToFile:atomically:消息被发送给字典对象glossary,使字典以属性列表的形式写入到文件glossary中。atomically参数被设置为YES,表示希望首先将字典写入临时备份文件中,并且一旦成功,将把最终数据转移到名为glossary的制定文件中。这是一种安全措施,它保护文件在一些情况下(如系统在执行操作的过程中崩溃时)免受破坏。在这种情况下,原始的glossary文件(如果该文件已经存在)不会受到损害。
要将文件中的XML属性列表读入程序,使用dictionaryWithContentsOfFile:或arrayWithContentsOfFile:方法。要读回数据,使用dataWithContentsOfFile:方法,要读回字符串对象使用stringWithContentsOfFile:方法。
如果查看创建的glossary文件,他的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>abstract class</key>
<string>A class defined so other class can inherit from it.</string>
<key>adopt</key>
<string>To implement all the methods defined in a protocol.</string>
<key>archiving</key>
<string>Storing an object for later use.</string>
</dict>
</plist>
根据字典创建属性列表时,字典中的键必须全都是NSString对象。数组的元素或字典中的值可以是NSString、NSArray、NSDictionary、NSData或NSNumber对象。
因篇幅问题不能全部显示,请点此查看更多更全内容