使用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) ...
随机推荐
- learning svn add file execuable
svn propset svn:executable on <file> 为了给svn仓库里的问件添加可执行权限.
- jQuery相关方法6----三大系列属性
一.获取和设置元素的宽和高------width( )方法和height()方法 <!-- 点击按钮,设置div的宽和高为原来的两倍 --> <script src="ht ...
- Mxnet框架搭建
Mxnet框架搭建 小书匠 kindle Mxnet是亚马逊开发的深度学习框架,和谷歌Tensorflow是同类型的框架. 1.安装Mxnet 这里只展示在线安装,源码编译安装等不演示:GPU安装与 ...
- UOJ 449 【集训队作业2018】喂鸽子 【生成函数,min-max容斥】
这是第100篇博客,所以肯定是要水过去的. 首先看到这种形式的东西首先min-max容斥一波,设\(f_{c,s}\)表示在\(c\)只咕咕中,经过\(s\)秒之后并没有喂饱任何一只的概率. \[ \ ...
- Atcoder Rating System
来翻译一下官方文档,但是建议看英文原文,本文可能会出现一些错误,只是为了方便自己查阅用的. 对于你的每一场rated比赛,会有一个Performance值\(X_i\),你的rating是\(X_i- ...
- Linux find,grep 命令
使用实验楼Linux环境开发,部分内容有所参考,link:https://www.shiyanlou.com/ 概述: find: 在目录中搜索文件,它的使用权限是所有用户 命令格式: find [路 ...
- [RK3399] Type-C改为MicroUSB
CPU:RK3399 系统:Android 7.1.2 为了降低成本,主板将 Type-C 改为 MicroUSB 接口,节省了 fusb302芯片 参考 Rockchip 的官方文档第4部分:Mic ...
- C#Winform ListView中没有Item双击事件的两种实现方法!
第一种: //if (this.listView1.FocusedItem != null) //{ // if (this.listView1.SelectedItems != null) // { ...
- Git放弃修改
Stage之前放弃修改 如果做了修改,还没有stage(add),使用 git status 可以查看所有的改动: 修改:modified 删除:deleted 添加:Untracked 想要放弃修改 ...
- ISO/IEC 9899:2011 条款5——5.1.2 执行环境
5.1.2 执行环境 1.定义了两个执行环境:独立式(freestanding)以及宿主的(hosted).在这两种情况下,当一个派定的C函数被执行环境调用时,程序就启动.所有具有静态存储周期的对象应 ...