使用NSKeyedArchiver归档

将各种类型的对象存储到文件中,而不仅仅是字符串、数组和字典类型,有一种更灵活的方法。就是利用NSKeyedAarchiver类创建带键(keyed)的档案来完成。

Mac OS X从版本10.2开始支持带键的档案。在此之前,要使用NSArchiver类创建连续的(sequential)归档。连续的归档需要完全按照写入时的顺序读取归档中的数据。

在带键的归档中,每个归档字段都有一个名称。归档某个对象时,会为它提供一个名称,即键。从归档中检索该对象时,是根据这个键来检索的。这样可以按照任意的顺序将对象写入归档并进行检索。另外,如果向类添加了新的实例变量或删除了实例变量,程序也可以进行处理。

注意:默认情况下,只能对NSDate, NSNumber, NSString, NSArray, or NSDictionary来进行归档。

如果要归档我们自定义的对象,在part2会讲解

part1

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        //---------------使用NSKeyedArchiver归档(存储各种类型的对象数据)-------------
        //将字典数据写到文件glossary.archive中
        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
                                  ];
        [NSKeyedArchiver archiveRootObject:glossary toFile:@"glossary.archive"];

        //将文件glossary.archive中的数据读到字典对象并显示出来
        NSDictionary *readglossary = [NSKeyedUnarchiver unarchiveObjectWithFile:@"glossary.archive"];

        for(NSString *key in readglossary)
            NSLog(@"%@: %@",key,[readglossary objectForKey:key]);
    }
    return 0;
}

其中,

    [NSKeyedArchiver archiveRootObject:glossary toFile:@"glossary.archive"];

将字典glossary写入到文件glossary.archive中。可以为该文件指定任何路径名。在本例中,文件被写入当前目录下。

之后,又通过

    NSDictionary *readglossary = [NSKeyedUnarchiver unarchiveObjectWithFile:@"glossary.archive"];

方法将创建的归档文件读入执行程序中。这个语句将指定的文件打开并读取文件的内容,该文件必须是以前归档操作的结果。可以为文件指定完整路径名或相对路径名。

在显示结果之后,可以简单的通过枚举其内容来验证恢复是否成功。

原文http://blog.csdn.net/enuola/article/details/7802371

part2

但是,当我们对自己定义的对象进行“编码/解码”操作时,却需要实现NSCoding协议的相关方法来告诉程序如何来“编码/解码”我们自己的对象!

NSCoding协议的方法:

- (void)encodeWithCoder:(NSCoder *)aCoder;

- (id)initWithCoder:(NSCoder *)aDecoder;

那么,我们就对类实现“编码/解码”协议:

在AddressCard.h中,申明实现NSCoding协议:

@interface AddressCard : NSObject<NSCopying,NSCoding>

在AddressCard.m中,实现NSCoding协议的编码/解码 方法:

#pragma mark- NSCoding

- (void)encodeWithCoder:(NSCoder *)aCoder{

[aCoder encodeObject:self.name forKey:@"AddressCard_name"];

[aCoder encodeObject:self.email forKey:@"AddressCard_email"];

[aCoder encodeInt32:self.salary forKey:@"AddressCard_salary"];

}

- (id)initWithCoder:(NSCoder *)aDecoder{

_name=[[aDecoder decodeObjectForKey:@"AddressCard_name"] retain];

_email=[[aDecoder decodeObjectForKey:@"AddressCard_email"] retain];

_salary=[aDecoder decodeInt32ForKey:@"AddressCard_salary"];

return self;

}

这样,我们就能够归档自己定义的类对象。

NSString *filePhyName=[filePath stringByAppendingPathComponent:@"ObjectFile"];

BOOL isSuccess=NO;

isSuccess= [NSKeyedArchiver archiveRootObject:objArray toFile:filePhyName];

if (isSuccess) {

NSLog(@"Success");

}else{

NSLog(@"False");

}

// 反归档

NSMutableArray *myObj=[NSKeyedUnarchiver unarchiveObjectWithFile:filePhyName];

for (AddressCard *theCard in myObj) {

[theCard print];

}

从输出可以看到,归档成功!

归档需要注意的是:

1.同一个对象属性,编码/解码的key要相同!

2.每一种基本数据类型,都有一个相应的编码/解码方法。

如:encodeObject方法与decodeObjectForKey方法,是成对出现的。

3.如果一个自定义的类A,作为另一个自定义类B的一个属性存在;那么,如果要对B进行归档,那么,B要实现NSCoding协议。并且,A也要实现NSCoding协议。

时间: 2024-10-27 12:34:19

使用NSKeyedArchiver归档的相关文章

简单的数据存储——plist、NSKeyedArchiver归档、NSUserDefaults(偏好设置)、SQLite(嵌入式数据库)

数据存储的五种方法: 1.xml属性列表(plist归档) 2.NSKeyedArchiver归档(加密形式) 3.NSUserDefaults(偏好设置) 4.SQLite(嵌入式数据库) 5.Core Date(面向对象方式的嵌入式数据库) 一.plist的读写 缺点: 1.明文保存 2.操作对象有限只有NSArray.NSMutableArray.NSDictionary.NSMutableDictionary支持 (归档时只要调用对应的writeToFile方法即可,解档调用arrayW

iOS中的数据存储 NSUserDefault NSKeyedArchiver(归档和反归档)

应用沙盒: 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录)与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒. 模拟器应用沙盒的根路径在: (apple是用户名, 6.0是模拟器版本) /Users/apple/Library/Application Support/iPhone Simulator/6.0/Applications 或者: /Users/用户名/资源库/Application Support/iPhone Simulator/6.1/Applic

IOS 数据存储(NSKeyedArchiver 归档篇)

什么是归档 当遇到有结构有组织的数据时,比如字典,数组,自定义的对象等在存储时需要转换为字节流NSData类型数据,再通过写入文件来进行存储. 归档的作用 之前将数据存储到本地,只能是字符串.数组.字典.NSNuber.BOOL等容器类对象,不能将自定义对象进行保存,而通过归档能将所有的对象转化为二进制数据存储到文件中. 归档的缺点 归档保存数据,只能一次性归档保存以及一次性解压.所以只能针对小量数据,而且对数据操作比较笨拙,即如果想改动数据的某一小部分,还是需要解压整个数据或者归档整个数据.

IOS开发——UI进阶篇(十一)应用沙盒,归档,解档,偏好设置,plist存储,NSData,自定义对象归档解档

1.iOS应用数据存储的常用方式XML属性列表(plist)归档Preference(偏好设置)NSKeyedArchiver归档(NSCoding)SQLite3 Core Data 2.应用沙盒每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒应用沙盒的文件系统目录,如下图所示(假设应用的名称叫Layer)模拟器应用沙盒的根路径在: (apple是用户名, 8.0是模拟器版本)/Users/apple/Libra

关于iOS的归档

归档,在其他语言中又叫“序列化”,就是将对象保存到硬盘:解档,在其他语言又叫“反序列化”就是将硬盘文件还原成对象.其实归档就是数据存储的过程,在IOS中数据的存储有五种方式: xml属性列表(plist归档) NSUserDefaults(偏好设置) NSKeyedArchiver归档(加密形式) SQLite3(嵌入式数据库) Core Data(面向对象方式的嵌入式数据库) 一.首先我们先来看一下xml属性列表,xml属性列表进行归档的方式是将对象存储在一个plist文件中,这个操作起来比较

iOS边练边学--应用数据存储的常用方式(plist,Preference,NSKeyedArchiver)其中的三种

iOS应用数据存储的常用方式: XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3--这里暂且不讲 Core Data--这里暂且不讲 一.应用沙盒 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒 应用沙盒的文件系统目录,如下图所示 二.应用沙盒结构分析 应用程序包:(上图中的Layer)包含了所有的资源文件和可执行文件 Do

iOS:沙盒、偏好设置、归档、解归档

一.沙盒和应用程序包 •iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被称为沙盒 •iOS常用目录: –Bundle –Documents –Library/Caches –Library/Preference –tmp 显示mac隐藏文件:defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏mac隐藏文件:defaults write com.apple.finder AppleSh

持久化存储——偏好设置,plist,归档---学习笔记二

//一. 本地持久化 //1.沙盒 //1.1 应用程序包:存放的是应用程序的源文件,包括资源文件和可执行文件 NSString *path = [[NSBundle mainBundle]bundlePath]; //1.2 Documents:最常用的目录,iTunes同步该应用时会同步此文件夹中的内容,适合存储重要数据 NSString *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDo

ios 归档学习笔记

归档是指用某种格式来保存一个或者多个对象,以便以后还原这些对象的过程. 使用xml属性列表进行归档 如果你是对NSString,NSDictionary,NSArray,NSData,NSNumber对象进行归档,可以使用类中实现的writeToFile:atomically:方法将数据写到文件中. 使用dictionaryWithContentsOfFile 或者arrayWithContentsOfFile,dataWithContentsOfFile,stringWithContentsO