使用runtime完成解档归档
简单的创建一个Person对象,并声明几个属性
@interface Person : NSObject<NSCoding> // 归档问题 必须遵守该协议
/** */
@property(copy,nonatomic)NSString * name;
/** */
@property(assign,nonatomic)int age;
@property(assign,nonatomic)int age1;
@end
设置哪些属性是需要归档的
//告诉系统,归档哪些属性
- (void)encodeWithCoder:(NSCoder *)coder
{
//利用runtime 来归档!!
unsigned int count = ; // 拷贝一个类 的属性列表
Ivar * ivars = class_copyIvarList([Person class], &count); // 在C语言中 但凡看到了一个传递了基本数据类型的指针 一般都是在函数中 改变外面参数的值 (这个ivars 可以形象的比喻为 数组 但是又区别于数组 如当我们 做ivars[100] 有可能不会报我们常见的数组越界而返回一个null 所以你懂得) for (int i = ; i < count; i++) {
//拿出每一个Ivar
Ivar ivar = ivars[i];
const char * name = ivar_getName(ivar); // 将属性转行成字符串
NSString * KEY = [NSString stringWithUTF8String:name];
//归档
[coder encodeObject:[self valueForKey:KEY] forKey:KEY]; // 通过KVC 来拿到当前类 的属性
} //C语言里面!! 一旦遇到了copy creat new 需要释放 (否则 我们归档一次 内存泄漏一次 导致内存暴增)
free(ivars); }
设置哪些属性需要解档
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super init];
if (self) {
unsigned int count = ;
Ivar * ivars = class_copyIvarList([Person class], &count);
for (int i = ; i < count; i++) {
Ivar ivar = ivars[i];
const char * name = ivar_getName(ivar);
NSString * KEY = [NSString stringWithUTF8String:name];
//解档
id value = [coder decodeObjectForKey:KEY];
//通过KVC 设置
[self setValue:value forKey:KEY]; // 通过KVC 将拿到的 值 设置给当前类 的 属性
} free(ivars); // 释放内存
}
return self;
}
使用
- (IBAction)save:(id)sender {
//创建一个对象
Person * p = [[Person alloc]init];
p.name = @"hank";
p.age = ;
p.age1 = ;
NSString * tmpPath = NSTemporaryDirectory(); // 这里我们暂且放在 temp 路径里
NSString * filePath = [tmpPath stringByAppendingPathComponent:@"hank.hank"];
//归档!!
[NSKeyedArchiver archiveRootObject:p toFile:filePath];
}
- (IBAction)read:(id)sender {
//路径
NSString * tmpPath = NSTemporaryDirectory();
NSString * filePath = [tmpPath stringByAppendingPathComponent:@"hank.hank"];
//解档
Person * p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%@老师今年%d岁了!真实年龄是:%d",p.name,p.age,p.age1);
}
优点:但当该类拥有上百个属性时,那将会花费更多的功夫在重复代码上,所以使用运行时机制截取类的成员变量,进行赋值,节省了大量的开发时间
by:ml
使用runtime完成解档归档的更多相关文章
- iOS开发中的4种数据持久化方式【一、属性列表与归档解档】
iOS中的永久存储,也就是在关机重新启动设备,或者关闭应用时,不会丢失数据.在实际开发应用时,往往需要持久存储数据的,这样用户才能在对应用进行操作后,再次启动能看到自己更改的结果与痕迹.ios开发中, ...
- Runtime应用(三)实现NSCoding的自动归档和自动解档
当我们需要将一个对象进行归档时,都要让该对象的类遵守NSCoding协议,再实现归档和接档方法.例如有一个Person类,该类有两个成员变量 @property (nonatomic,copy) NS ...
- IOS数据存储之归档/解档
前言: 前天学习了NSUserDefaults,我们知道NSUserDefaults不能保存自定义对象,所以我们今天来认识一下归档(NSKeyedArchiver)和解档(NSKeyedUnarchi ...
- OC对象的归档及解档浅析
一般用在用户登录,保存这个用户的信息 对象归档,就是把内存中对象持久化. 对象解档,就是把持久化的对象读取到内存. oc中对象归档解档大致分为以下几种方法: 从数量上可以分为: 对单个对象归档解档 对 ...
- iOS 自定义的对象类型的解档和归档
自定义的对象的解档和归档 如果想对自己自定义的类进行解档和归档的话 必须遵循一个协议:NSCoding Student.h 文件 #import <Foundation/Foundation.h ...
- iOS开发——UI进阶篇(十一)应用沙盒,归档,解档,偏好设置,plist存储,NSData,自定义对象归档解档
1.iOS应用数据存储的常用方式XML属性列表(plist)归档Preference(偏好设置)NSKeyedArchiver归档(NSCoding)SQLite3 Core Data 2.应用沙盒每 ...
- IOS s数据存储之归档解档
#import <Foundation/Foundation.h> @interface Student : NSObject <NSCoding>; @property(no ...
- iOS 浅复制、深复制、完全复制的知识点梳理验证(附加归档解档)
在之前转载的一片文章中,文中对浅复制和深复制进行了详细的解读,同时还提到了深复制(one-level-deep copy).完全复制(true copy)的概念,并指出iOS开发中的深复制是单层深赋值 ...
- 数据存储之归档解档 NSKeyedArchiver NSKeyedUnarchiver
在构建应用程序时,有一个重要的问题是如何在每次启动之间持久化数据,以便重现最后一次关闭应用前的状态.在iOS和OS X上,苹果提供了三种选择:Core Data.属性列表(Property List) ...
随机推荐
- centos7 安装 mysql5.6(MySQL-5.6.44-1.el7.x86_64.rpm-bundle.tar)
1.卸载MariaDB rpm -qa | grep -i mariadb rpm -e --nodeps mariadb-libs--.el7.x86_64 2.卸载已有Mysql 卸载旧版本mys ...
- [mysql] Mysql数据分组GROUP BY 和HAVING,与WHERE组合使用
理解分组,可以这样:对GROUP BY子句后面跟随的列名进行分组,然后对每一个分组而不是整个表进行操作. 举例:在产品表中,检索每一个供应商提供的商品的数量. mysql> SELECT ven ...
- Android 系统添加SELinux权限
本文为博主原创文章,转载请注明出处:https://i.cnblogs.com/EditPosts.aspx?postid=11185476 CPU:RK3288 系统:Android 5.1 SEL ...
- Beta冲刺(2/4)
队名:福大帮 组长博客链接:https://www.cnblogs.com/mhq-mhq/p/11990570.html 作业博客 : https://edu.cnblogs.com/campus/ ...
- js学习笔记(1)
前言 因为后期的软件工程组队作业需要js,在纪华裕大佬的带领下(我觉得他好像更喜欢纪华裕这个名字),我开始了js的学习.其实这篇博客应该在两天前的晚上就发出来了,因为忙着写个人编程,拖到了现在,组 ...
- Linux如何使用shell命令检测PHP木马防止脚本木马的破坏
1.一句话查找PHP木马 代码如下 # find / -name "*.php" |xargs egrep "phpspy|c99sh|milw0rm|eval\(gun ...
- Locust - A modern load testing framework https://locust.io/
Locust - A modern load testing frameworkhttps://locust.io/
- Webservice初体验:axis调用wsdl和document解析
Neo君遇到了需要调用webservice接口的情况,然而作为一只小白对这方面了解困乏,经过摸索,完成了一个小的Demo,记录下. 一:背景 同事给了我一个webservice地址,打开后后缀是&qu ...
- Kibana的安装与配置
Kibana的安装与配置 配置 [root@es01 kibana-5.6.3-linux-x86_64]# egrep -v '^$|^#' config/kibana.yml server.hos ...
- OSG节点访问和遍历
遍历节点树:osg::Node类中有两个辅助函数: void ascend(NodeVisitor& nv) //虚函数,向上一级节点推进访问器 void traverse(NodeVisit ...