用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语言的函数调用请看这里 ) ...
随机推荐
- oracle日志挖掘
oracle日志挖掘是一种十分强大的数据恢复技术,只要你保障你的归档日志和重做日志是完整的,那么就可以将你的数据恢复到任何时刻.简单叙述一下日志挖掘的基本原理,然后进行一个简单的小实验. 日志挖掘时基 ...
- [转] .NET领域驱动设计—看DDD是如何运用设计模式颠覆传统架构
阅读目录: 1.开篇介绍 2.简单了解缘由(本文的前期事宜) 3.DomainModel扩展性(运用设计模式设计模型变化点) 3.1.模型扩展性 3.2.设计模式的使用(苦心专研的设计模式.设计思想可 ...
- 高考志愿填报:java 软件 程序员 目前的就业现状
大约在17年前,也就是2000年,学计算机专业的学生可以有大部分都进入本专业,并且就业非常容易.哪怕只会office套件,想找个工作也很简单.那时候学计算机就是最热门的行业. 那时候,搞Java的还是 ...
- url地址栏拼接参数写法
<script> function jiedan_do(elm){ var id=$(elm).attr("a"); window.location="__U ...
- 错误Fatal error: Call to undefined function mb_strlen()的解决办法
其实这个就是没有开启php_mbstring模块.Windows下只需要修改安装目录下的php.ini文件把extension=php_mbstring.dll前面的“#”号注释符去掉保存后重启Apa ...
- ReactiveCocoa源码解析(四) Signal中的静态属性静态方法以及面向协议扩展
上篇博客我们聊了Signal的几种状态.Signal与Observer的关联方式以及Signal是如何向关联的Observer发送事件的.本篇博客继续上篇博客的内容,来聊一下Signal类中静态的ne ...
- web拖动条显示
<!DOCTYPE html"> <html> <head> <title>滚动条拖动评分的JS效果</title> <st ...
- Handlebars.js 模板引擎
介绍 Handlebars 是 JavaScript 一个语义模板库,通过对view和data的分离来快速构建Web模板.它采用"Logic-less template"(无逻辑模 ...
- Python 3从入门到精通01-环境搭建
本系列开始介绍Python3的基础教程,为什么要选中Python 3呢?因为最近看到一些资料和课程,都是Python 3授课的,例如,大数据,机器学习,数据挖掘等等:还有一个目的,我想彻底地,系统地学 ...
- 关于STM32单片机的IAP实现
基于STM32F103单片机的IAP实现(虽然该篇文章不会详细写出实现细节,但是会从一个全局的角度讲述,实际的实现细节只需根据datasheet即可完成). 一.基础概念 什么是IAP?IAP即在应用 ...