归档类与解归档类的属性以及方法的了解

归档的方式就是将数据通过密文的方式存储,或者说是可以通过二进制进行存储。

归档的属性和方法:NSKeyedArchiver

 FOUNDATION_EXPORT NSString * const NSInvalidArchiveOperationException;
FOUNDATION_EXPORT NSString * const NSInvalidUnarchiveOperationException;
上面的两个常量都是用来处理异常的,一个是归档一个是解压归档的时候使用的。s

FOUNDATION_EXPORT NSString * const NSKeyedArchiveRootObjectKey NS_AVAILABLE(10_9, 7_0);
//这个关键字就是不管是类的归档方法还是相应的个别的实力发那个是,都是可以用这个关键字来充当对象的关键字的key。archivedRootDataWithObject:、unarchiveObjectWithData等

+ (NSData *)archivedDataWithRootObject:(id)rootObject;  //将对象归档为Data类型的数据
+ (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path;// rootObject对象写在path制定的路径下面
- (instancetype)initForWritingWithMutableData:(NSMutableData *)data; //

@property NSPropertyListFormat outputFormat; //NSPropertyListFormat这个是一种枚举类型
typedef NS_ENUM(NSUInteger, NSPropertyListFormat) {
    NSPropertyListOpenStepFormat = kCFPropertyListOpenStepFormat,//明文的方式
    NSPropertyListXMLFormat_v1_0 = kCFPropertyListXMLFormat_v1_0,//这个是xml的格式
    NSPropertyListBinaryFormat_v1_0 = kCFPropertyListBinaryFormat_v1_0//这个是二进制的格式
};

- (void)finishEncoding;
//完成编码(归档)

+ (void)setClassName:(NSString *)codedName forClass:(Class)cls;
- (void)setClassName:(NSString *)codedName forClass:(Class)cls;
//在编码过程中,编码器首先检查编码器的自己的表,如果没有可以设置相应映射给该类的。
//设置归档的类名字

+ (NSString *)classNameForClass:(Class)cls;
- (NSString *)classNameForClass:(Class)cls;
//获取归档的类名字,获取该类中的映射名字

- (void)encodeObject:(id)objv forKey:(NSString *)key;
- (void)encodeConditionalObject:(id)objv forKey:(NSString *)key;
- (void)encodeBool:(BOOL)boolv forKey:(NSString *)key;
- (void)encodeInt:(int)intv forKey:(NSString *)key;    // native int
- (void)encodeInt32:(int32_t)intv forKey:(NSString *)key;
- (void)encodeInt64:(int64_t)intv forKey:(NSString *)key;
- (void)encodeFloat:(float)realv forKey:(NSString *)key;
- (void)encodeDouble:(double)realv forKey:(NSString *)key;
- (void)encodeBytes:(const uint8_t *)bytesp length:(NSUInteger)lenv forKey:(NSString *)key;
//为相应的存储(归档)类进行的相应的值设置,也就是key的方式进行设置,我们这里一般都是通过关键字和字符串的方式进行设置。
eg:person类中:[person encodeObject:name forKey:@"name"]; //这样就表示相应的值进行设置
]

// 设置是否安全编码(归档),编码是归档对数据的一种方式,或者说编码的方式是多种的,而归档又是数据存储的一种方式。
- (void)setRequiresSecureCoding:(BOOL)b ;
//***不需要通过设置安全编码归档到解归档的的过程(也就是这个过程不是一个连贯的过程)
//安全归档只不过是一种确保所有的类都是安全归档,这个方法为yes的时候,如果一个类没有安全归档将会跑出异常。注意:getter方法是在父类NSCoder,可以查看它了解更加多的安全编码。

@interface NSKeyedArchiver : NSCoder {
@private
    void *_stream;
    NSUInteger _flags;
    id _delegate;
    id _containers;
    id _objects;
    id _objRefMap;
    id _replacementMap;
    id _classNameMap;
    id _conditionals;
    id _classes;
    NSUInteger _genericKey;
    void *_cache;
    NSUInteger _cacheSize;
    NSUInteger _estimatedCount;
    void *_reserved2;
    id _visited;
    void *  __strong _reserved0;
}//私有属性

代理方法:

@protocol NSKeyedArchiverDelegate <NSObject>
@optional
//替代
- (id)archiver:(NSKeyedArchiver *)archiver willEncodeObject:(id)object;

- (void)archiver:(NSKeyedArchiver *)archiver didEncodeObject:(id)object;

// 通知
- (void)archiver:(NSKeyedArchiver *)archiver willReplaceObject:(id)object withObject:(id)newObject;

- (void)archiverWillFinish:(NSKeyedArchiver *)archiver;

- (void)archiverDidFinish:(NSKeyedArchiver *)archiver;

分类方法(object的):
@interface NSObject (NSKeyedArchiverObjectSubstitution)

@property (readonly) Class classForKeyedArchiver;

- (id)replacementObjectForKeyedArchiver:(NSKeyedArchiver *)archiver;

+ (NSArray *)classFallbacksForKeyedArchiver;

@end

//编码方式:编码的两个方法
@protocol NSCoding(必须实现的方法)

- (void)encodeWithCoder:(NSCoder *)aCoder;//编码(保存)
- (id)initWithCoder:(NSCoder *)aDecoder; //解码(获取)
@end

下面的是解归档的属性和方法 NSKeyedUnarchiver

@interface NSKeyedUnarchiver : NSCoder {
@private
    id _delegate;
    uint32_t _flags;
    id _objRefMap;
    id _replacementMap;
    id _nameClassMap;
    id _tmpRefObjMap;
    id _refObjMap;
    int32_t _genericKey;
    id _data;
    void *_offsetData;
    id _containers;
    id _objects;
    const uint8_t *_bytes;
    uint64_t _len;
    id _helper;
    void *  __strong _reserved0;
}//私有属性,基本和归档的类是一样的。

解归档的方式:
+ (id)unarchiveObjectWithData:(NSData *)data;
+ (id)unarchiveObjectWithFile:(NSString *)path;
- (instancetype)initForReadingWithData:(NSData *)data;

- (void)finishDecoding;

+ (void)setClass:(Class)cls forClassName:(NSString *)codedName;
- (void)setClass:(Class)cls forClassName:(NSString *)codedName;
+ (Class)classForClassName:(NSString *)codedName;
- (Class)classForClassName:(NSString *)codedName;

- (BOOL)containsValueForKey:(NSString *)key;

- (id)decodeObjectForKey:(NSString *)key;
- (BOOL)decodeBoolForKey:(NSString *)key;
- (int)decodeIntForKey:(NSString *)key;     // may raise a range exception
- (int32_t)decodeInt32ForKey:(NSString *)key;
- (int64_t)decodeInt64ForKey:(NSString *)key;
- (float)decodeFloatForKey:(NSString *)key;
- (double)decodeDoubleForKey:(NSString *)key;
- (const uint8_t *)decodeBytesForKey:(NSString *)key returnedLength:(NSUInteger *)lengthp NS_RETURNS_INNER_POINTER; 

- (void)setRequiresSecureCoding:(BOOL)b NS_AVAILABLE(10_8, 6_0);

//上面的方法基本和归档类中的方法是一样,只不过是一个相反的过程。

@protocol NSKeyedUnarchiverDelegate <NSObject>
@optional

// error handling
- (Class)unarchiver:(NSKeyedUnarchiver *)unarchiver cannotDecodeObjectOfClassName:(NSString *)name originalClasses:(NSArray *)classNames;

// substitution
- (id)unarchiver:(NSKeyedUnarchiver *)unarchiver didDecodeObject:(id) NS_RELEASES_ARGUMENT object NS_RETURNS_RETAINED;

// notification
- (void)unarchiver:(NSKeyedUnarchiver *)unarchiver willReplaceObject:(id)object withObject:(id)newObject;
 ded objects.

- (void)unarchiverWillFinish:(NSKeyedUnarchiver *)unarchiver;
    // Notifies the delegate that decoding is about to finish.

- (void)unarchiverDidFinish:(NSKeyedUnarchiver *)unarchiver;
    // Notifies the delegate that decoding has finished.

@end

系统定义好的分类方法:
@interface NSObject (NSKeyedUnarchiverObjectSubstitution)

+ (Class)classForKeyedUnarchiver;

@end

总结:

1、数据的归档和解归档是对数据的存数和获取的过程

2、归档和解归档都是继承于编码类NSCoder。都是在数据归档存储过程中所需要使用到的方法类类和方法。

时间: 2024-10-09 22:30:03

归档类与解归档类的属性以及方法的了解的相关文章

[.net 面向对象编程基础] (9) 类的成员(字段、属性、方法)

[.net 面向对象编程基础] (9) 类的成员(字段.属性.方法) 前面定义的Person的类,里面的成员包括:字段.属性.方法.事件等,此外,前面说的嵌套类也是类的成员. a.类的成员为分:静态成员(static)和非静态成员 b.静态成员用static标识,不标识则默认为非静态成员 c.静态成员属于类所有,动态成员则属于实例所有,即对象 d.静态成员为类所有实例共享,无论类有多少实例或副本,静态成员只占用存中一块区域.非静态成员则在类的每个实例,都创建一个内存域. 下面主要说明一下类的主要

javascript构造函数类和原型prototype定义的属性和方法的区别

1.把方法写在原型中比写在构造函数中消耗的内存更小,因为在内存中一个类的原型只有一个,写在原型中的行为可以被所有实例共享,实例化的时候并不会在实例的内存中再复制一份而写在类中的方法,实例化的时候会在每个实例中再复制一份,所以消耗的内存更高所以没有特殊原因,我们一般把属性写到类中,而行为写到原型中2.构造函数中定义的属性和方法要比原型中定义的属性和方法的优先级高,如果定义了同名称的属性和方法,构造函数中的将会覆盖原型中的代码如下: <!DOCTYPE html> <html> <

iOS:文件归档和解归档的详解和使用

文件归档和解归档: 用途: 所谓文件归档,就是把需要存储的对象数据存储到沙盒的Documents目录下的文件中,即存储到了磁盘上,实现数据的持久性存储和备份.解归档,就是从磁盘上读取该文件下的数据,用来完成用户的需求.对象归档是将对象归档以文件的形式保存到磁盘中(也称为序列化,持久化),使用的时候读取该文件的保存路径的读取文件的内容(也称为接档,反序列化),(对象归档的文件是保密的,在磁盘上无法查看文件中的内容,而属性列表是明文的,可以查看). 区别: 通过文件归档产生的文件是不可见的,如果打开

iOS归档与解归档,持久化存储

点此下载iOS归档,持久化存储,解归档详细工程 //数据持久化的本质:将数据读取成文件保存在本地. 沙盒机制就是系统针对于每一个程序在本地生成的文件夹(名字随机生成), 对于不同的应用程序, 不能访问其他应用程序沙盒内的内容, 对于该应用程序内容起到保护作用:1 Documents:用来存储长久保存的数据 2 xxx.app:应用程序的包, 包含应用程序加载所需的所有资源(readonly只读, 不可修改), 平时使用的NSBundle就是该包 3 Library: 1) Caches:本地缓存

QAction类详解:

先贴一段描述:Qt文档原文: Detailed Description The QAction class provides an abstract user interface action that can be inserted into widgets. In applications many common commands can be invoked via menus, toolbar buttons, and keyboard shortcuts. Since the user

原型链怎样给类下面的实例添加实例属性和实例方法

在这里要用到prototype这个关键字了,通过这个关键字可以给类下面的实例添加实例属性和方法,话不多说,直接上代码 代码实例如下: function Person(name) { this.name = name;}var p1 = new Person("zhangsan");Person.prototype.age = 18; //为类下面的实例添加实例属性Person.prototype.speak = function() { //为类下面的实例添加实例方法 console.

(转)基于RTP的H264视频数据打包解包类

最近考虑使用RTP替换原有的高清视频传输协议,遂上网查找有关H264视频RTP打包.解包的文档和代码.功夫不负有心人,找到不少有价值的文档和代码.参考这些资料,写了H264 RTP打包类.解包类,实现了单个NAL单元包和FU_A分片单元包.对于丢包处理,采用简单的策略:丢弃随后的所有数据包,直到收到关键帧.测试效果还不错,代码贴上来,若能为同道中人借鉴一二,足矣.两个类的使用说明如下(省略了错误处理过程): DWORD H264SSRC ; CH264_RTP_PACK pack ( H264S

struts2-环境搭建-访问流程-配置详解-常量配置-类详解

1 struts2概述 1.1 概念  1.2 struts2使用优势 自动封装参数 参数校验 结果的处理(转发|重定向) 国际化 显示等待页面 表单的防止重复提交 struts2具有更加先进的架构以及思想 struts2的历史 struts2与struts1区别就是技术上没有什么关系. struts2的前身时webwork框架. 2 搭建struts2框架 2.1.导包 怎么快速找到要导入的包?! 路径: \struts2-day01\resource\struts-2.3.24\apps\s

python中的类和对象,属性和方法

一.面向对象的概述面向对象是一种描述业务问题.设计业务实体和实体之间关系的方法二.类和对象1.类和对象得区别:类是对客观世界中事物得抽象,而对象是类实例化后的实体   例如:汽车模型就是一个类,制造出来的每辆汽车就是一个对象2.类的定义:   (1)python使用class关键字定义一个类,类名的首字母一般要大写:       例如: class Student: #定义了一个Student类   (2)类的主体由一系列的属性和方法组成       例如: class Fruit: #定义一个