Runtime应用(三)实现NSCoding的自动归档和自动解档
当我们需要将一个对象进行归档时,都要让该对象的类遵守NSCoding协议,再实现归档和接档方法。例如有一个Person类,该类有两个成员变量
@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) int age;
两个协议的实现方法如下
/**
* 将对象写入某个文件时需要调用,在该方法中说明哪些属性需要存储
*/
- (void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:self.name forKey:@"name"];
[encoder encodeInt:self.age forKey:@"age"];
} /**
* 从文件中解析对象时会调用,在该方法中解析对象的属性
*/
- (id)initWithCoder:(NSCoder *)decoder
{
if (self = [super init]) {
// 解析之后要赋值给属性
_name = [decoder decodeObjectForKey:@"name"];
_age = [decoder decodeIntForKey:@"age"];
}
return self;
}
但当该类拥有上百个属性时,那将会花费更多的功夫在重复代码上,所以使用运行时机制截取类的成员变量,进行赋值
例如有一个狗类Dog和它的父类动物类Animal
狗类的成员变量有
@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) int age;
动物类的成员变量有
@property (nonatomic,assign) double weight;
当我们需要将狗对象进行归档时,可以在类中这样重写归档和解档方法
- (id)initWithCoder:(NSCoder *)aDecoder
{ if (self = [super init]) {
Class c = self.class;
// 截取类和父类的成员变量
while (c && c != [NSObject class]) {
unsigned int count = ;
Ivar *ivars = class_copyIvarList(c, &count);
for (int i = ; i < count; i++) { NSString *key = [NSString stringWithUTF8String:ivar_getName(ivars[i])]; id value = [aDecoder decodeObjectForKey:key]; [self setValue:value forKey:key]; }
// 获得c的父类
c = [c superclass];
free(ivar);
} }
return self;
} - (void)encodeWithCoder:(NSCoder *)aCoder
{ Class c = self.class;
// 截取类和父类的成员变量
while (c && c != [NSObject class]) {
unsigned int count = ; Ivar *ivars = class_copyIvarList(c, &count); for (int i = ; i < count; i++) {
Ivar ivar = ivars[i];
NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)]; id value = [self valueForKey:key]; [aCoder encodeObject:value forKey:key];
}
c = [c superclass];
// 释放内存
free(ivar);
} }
代码测试:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
CXDog *d = [[CXDogalloc] init];
d.name = @"cx";
d.age = ;
d.weight = 1.55;
// 将对象归档
[NSKeyedArchiverarchiveRootObject:d toFile:@"/Users/c_xie/Desktop/wj.xxoo"];
// 将对象解档
CXDog *dog = [NSKeyedUnarchiverunarchiveObjectWithFile:@"/Users/c_xie/Desktop/wj.xxoo"];
NSLog(@"%@,%d,%f",dog.name,dog.age,d.weight); }
以后就算有再多的属性,一个循环搞定
Runtime应用(三)实现NSCoding的自动归档和自动解档的更多相关文章
- 归档 Archive、解档Unchive、 XML(一)
1 使用归档的方式保存文件 1.1 问题 归档是任何对象都可以实现的更常规的方式,可以进行归档的对象需要实现NSCoding协议,而且每个实例变量应该是基本数据类型或者是实现NSCoding协议的某个 ...
- OC对象的归档及解档浅析
一般用在用户登录,保存这个用户的信息 对象归档,就是把内存中对象持久化. 对象解档,就是把持久化的对象读取到内存. oc中对象归档解档大致分为以下几种方法: 从数量上可以分为: 对单个对象归档解档 对 ...
- Runtime之NSCoding的自动归档、接档
为什么要有Runtime的NSCoding的自动归档.接档 大家所熟知的方法 //归档方法 - (void)encodeWithCoder:(NSCoder *)aCoder { //当学生被归档,学 ...
- Linux下Tomcat catalina.out自动归档,以及logrotate 配置详解
Linux下Tomcat catalina.out自动归档 如果 catalina.out 日志达到 2GB 大小的时候,Tomcat 因为缓存问题,便没有办法继续输出日志了. 为了避免这种情况,你 ...
- (转发)IOS高级开发~Runtime(三)
11.系统类的方法实现部分替换 - (void) methodExchange { Method m1 = class_getInstanceMethod([NSStringclass],@selec ...
- 使用runtime完成解档归档
简单的创建一个Person对象,并声明几个属性 @interface Person : NSObject<NSCoding> // 归档问题 必须遵守该协议 /** */ @propert ...
- CUDA运行时 Runtime(三)
CUDA运行时 Runtime(三) 一.异步并发执行 CUDA将以下操作公开为可以彼此并发操作的独立任务: 主机计算: 设备计算: 从主机到设备的内存传输: 从设备到主机的存储器传输: 在给定设备的 ...
- 自动归档autoArchive By H.l
写点简单的代码,让开发更简单 详情:ios 应用实现快速的临时缓存之模型的自动归档 Demo:https://files.cnblogs.com/files/sixindev/AutoArchiver ...
- [Android] Android 异步定时任务实现的三种方法(以SeekBar的进度自动实现为例)
[Android] Android 定时异步任务实现的三种方法(以SeekBar的进度自动实现为例) 一.采用Handler与线程的sleep(long)方法 二.采用Handler与timer及Ti ...
随机推荐
- Cookie application session
•Application 对象是存储于服务器的全局变量 •Cookie 存储信息于客户端 •Session 对象用于在服务器端存储用户的信息,在用户结束会话时被清除 1.将信息写入Cookies 中/ ...
- 【C#/WPF】窗体定时自动关闭
需求:打开WPF项目后,展示3秒钟产品Logo后,进入主界面MainWindow.(类似于安卓应用打开时的闪屏页SplashPage) 思路:在进入MainWindow后新建一个Window窗体,窗体 ...
- pthread_cond_wait()函数的详解
http://hi.baidu.com/tjuer/item/253cc6d66b921317d90e4483 了解 pthread_cond_wait() 的作用非常重要 -- 它是 POSIX 线 ...
- Python写自己主动化之邮件发送(匿名)
为了可以实现邮件发送功能.首先.我们须要了解一下邮件的发送过程是什么样子的,此处不再具体说明,请大家自行搜索或查看p=438">http://www.sogouqa.com/?p=43 ...
- .net垃圾回收
垃圾回收器(gc)用来在.NET中进行内存管理,特别是它可以恢复正在运行的应用程序需要的内存. .NET运行库采用的方法是垃圾回收器,这是一个程序,其目的是清理内存.方法是所有动态请求的内存都分配到堆 ...
- WPF教程二:布局之StackPanel面板
应用程序界面设计中,合理的元素布局至关重要,它可以方便用户使用,并将信息清晰合理地展现给用户.WPF提供了一套功能强大的工具-面板(Panel),来控制用户界面的布局.你可以使用这些面板控件来排布元素 ...
- QThread 的使用方法及函数解析
近日,使用QThread,一些问题百思不得其解,看过大牛的文章,恍然大悟啊. 原文 http://hi.baidu.com/dbzhang800/item/c14c97dd15318d17e1f46f ...
- Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering
Defferrard, Michaël, Xavier Bresson, and Pierre Vandergheynst. "Convolutional neural networks o ...
- Hibernate 注解中CascadeType用法汇总
这两天,参加一个课程设计,同时这个项目又作为一个模块镶嵌到其他项目中,考虑如此,应与原先的架构相同,因牵扯到留言和相互@功能,故数据库之间OneToOne,OneToMany,ManyToMany之风 ...
- Blend for Visual Studio 2013
软件开发中为了使设计师和程序员“并行”工作并直接参与到程序的开发中来. 1.在网络程序开发团队中,草图设计后,设计师们可以使用HTML.CSS.JavaScript直接生成UI,程序员则在这个UI产生 ...