用runtime封装归档(encoding)
//遵循协议
@interface NSObject (Coding)<NSCoding>
@end
#import <objc/runtime.h>
@implementation NSObject (Coding)
- (void)encodeWithCoder:(NSCoder *)coder
{
//属性个数
unsigned int count = 0;
//拷贝所有成员的属性,传count的地址,count的值会改变,传值和传地址的区别
Ivar * ivars = class_copyIvarList([self class], &count);
for (int i = 0; i < count; i++) {
// 从列表中取出属性,在c语言中指针就相当于数组
Ivar ivar = ivars[i];
//取出名称
const char * name = ivar_getName(ivar);
//转NSString,取出key
NSString *key = [NSString stringWithUTF8String:name];
//kvc取值value,归档
[coder encodeObject:[self valueForKey:key] forKey:key];
}
//在C语言中,只要用到copy就会有指针泄露,所以要释放指针
free(ivars);
}
//解挡
- (instancetype)initWithCoder:(NSCoder *)coder
{
if (self = [self init]) {
//解档
unsigned int count = 0;
//copy所有属性
Ivar * ivars = class_copyIvarList([self class], &count);
for (int i = 0; i < count; i++) {
//取属性
Ivar ivar = ivars[i];
//取name
const char * name = ivar_getName(ivar);
//转NSString
NSString *key = [NSString stringWithUTF8String:name];
//解挡
id value = [coder decodeObjectForKey:key];
//设置到自己的属性上去
[self setValue:value forKey:key];
}
//释放指针
free(ivars);
}
return self;
}
用的时候直接建这样一对category文件,用的时候直接把头文件导进去就可以了
用runtime封装归档(encoding)的更多相关文章
- runtime之归档和解档
IOS开发之NSCoding协议(使用runtime)近期学习IOS的runtime库,然后看到之前写的NSCoding协议有点复杂,如果属性少还好,如果100多个属性,则会显得麻烦.下面使用常规方式 ...
- Runtime 自动化归档
Runtime的使用 (id)initWithCoder:(NSCoder *)decoder { if (self = [super init]) { unsigned ; Ivar *ivars ...
- iOS--通过runtime完成归档,反归档
通过runtime,不管模型有多少属性,通过几句代码就能完成. 假设person类有N多个属性而是(这里随便写3个) .h #import <Foundation/Foundation.h> ...
- 使用runtime完成解档归档
简单的创建一个Person对象,并声明几个属性 @interface Person : NSObject<NSCoding> // 归档问题 必须遵守该协议 /** */ @propert ...
- Runtime -----那些被忽略的技能
有人说现在的程序员都被惯坏了,尤其使用一些面向对象的语言开发的时候,只是简单的调用一些系统封装好的接口或者是调用一些“便利的”第三方,对于一个程序的真正实现有了解吗???又有多少了解呢 ...
- runtime实现对象存储型数据库——LHDB
前言 最近在GitHub上看了一份关于基于runtime封装的对象存储型数据库的开源代码,觉得非常值得分享记录一下,在IOS中对数据库的操作一般通过CoreData和SQLite,CoreData 虽 ...
- runtime理论知识
http://southpeak.github.io/2014/10/25/objective-c-runtime-1/ 转载http://www.jianshu.com/p/6b905584f536 ...
- runtime运行机制方法学习
runtime这玩意第一次听说时都不知道是什么,经过了解后才知道它就是oc动态语言的机制,没有它那oc就不能称为动态语言.在之前可能大家对runtime了解都不深,随着编程技能的日益加深和需要,大家开 ...
- iOS之RunTime浅谈
首先说一下什么是runtime:RunTime简称运行时.就是系统在运行的时候的一些机制,其中最主要的是消息机制.对于C语言,函数的调用 在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 ) ...
随机推荐
- cookie笔记(一)
1.浏览器存储信息的一个工具 2.容量有限,每个域名一般50个.详情 3.形式:键=值: 4.获取:document.cookie; 5.设置:document.cookie="uid=we ...
- 聊聊AngularJs
大家好! 今天我们要说的就是我们的AngularJs 当然呢!我们Angular呢! 1.是一个MVC框架,如果我们说他是一个mvc的框架呢!就是有些不太具体了,其实他是我们的MVC的扩展版 当然他具 ...
- Ubuntu上使用Web QQ
Linux下的pidgin已经不支持QQ了,只能用Web QQ了.Firefox应用市场(Firefox Marketplace)中有一款QQ的Web应用,比你打开浏览器输入网址用得稍微方便点.不 ...
- PHP:phpMyAdmin如何解决本地导入文件(数据库)为2M的限制
经验地址:http://jingyan.baidu.com/article/e75057f2a2288eebc91a89b7.html 当我们从别人那里导出数据库在本地导入时,因为数据库文件大于2M而 ...
- Spring Security3详细配置
Spring Security3详细配置 表名:RESOURCE 解释:资源表备注: 资源表 RESOURCE(资源表) 是否主键 字段名 字段描述 数据类型 长度 可空 约束 缺省值 备注 是 ID ...
- UWP的Converter妙用
MVVM模式的使用,简化了UWP应用的开发,使层次更加分明.在写xaml的时候,有些小技术还是很实用的:比如Converter,字面上理解是转换器,那它到底是转换什么的?接触过的可能知道它起的是类型转 ...
- js___原生js轮播
原生js轮播 作为一名前端工程师,手写轮播图应该是最基本掌握的技能,以下是我自己原生js写的轮播,欢迎指点批评: 首先css代码 a{text-decoration:none;color:#3DBBF ...
- Masonry 在swift下的使用
Masonry在oc下使用很方便,但是在swift下,由于oc方法和property都可以使用.fuc的语法,swift下只有属性可以使用.property的语法,方法只能写成.func().因此在s ...
- java 单链表的实现
package liaobiao;//链表测试public class Node { private int value; private Node next; //存放下一个节点的指针 //构造方法 ...
- mysql show processlist