runtime一套比较基层的c语言的API(库)
归档(OC对象-->字典—>2进制—>写入沙盒 || 目的.数据持久化)
 
#import <UIKit/UIKit.h>
//遵循协议
@interface NSObject (Coding)<NSCoding>
@end
 
 
#import "NSObject+Coding.h"
#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;
}

@end
用的时候直接建这样一对category文件,用的时候直接把头文件导进去就可以了
 

用runtime封装归档(encoding)的更多相关文章

  1. runtime之归档和解档

    IOS开发之NSCoding协议(使用runtime)近期学习IOS的runtime库,然后看到之前写的NSCoding协议有点复杂,如果属性少还好,如果100多个属性,则会显得麻烦.下面使用常规方式 ...

  2. Runtime 自动化归档

    Runtime的使用 (id)initWithCoder:(NSCoder *)decoder { if (self = [super init]) { unsigned ; Ivar *ivars ...

  3. iOS--通过runtime完成归档,反归档

    通过runtime,不管模型有多少属性,通过几句代码就能完成. 假设person类有N多个属性而是(这里随便写3个) .h #import <Foundation/Foundation.h> ...

  4. 使用runtime完成解档归档

    简单的创建一个Person对象,并声明几个属性 @interface Person : NSObject<NSCoding> // 归档问题 必须遵守该协议 /** */ @propert ...

  5. Runtime -----那些被忽略的技能

            有人说现在的程序员都被惯坏了,尤其使用一些面向对象的语言开发的时候,只是简单的调用一些系统封装好的接口或者是调用一些“便利的”第三方,对于一个程序的真正实现有了解吗???又有多少了解呢 ...

  6. runtime实现对象存储型数据库——LHDB

    前言 最近在GitHub上看了一份关于基于runtime封装的对象存储型数据库的开源代码,觉得非常值得分享记录一下,在IOS中对数据库的操作一般通过CoreData和SQLite,CoreData 虽 ...

  7. runtime理论知识

    http://southpeak.github.io/2014/10/25/objective-c-runtime-1/ 转载http://www.jianshu.com/p/6b905584f536 ...

  8. runtime运行机制方法学习

    runtime这玩意第一次听说时都不知道是什么,经过了解后才知道它就是oc动态语言的机制,没有它那oc就不能称为动态语言.在之前可能大家对runtime了解都不深,随着编程技能的日益加深和需要,大家开 ...

  9. iOS之RunTime浅谈

    首先说一下什么是runtime:RunTime简称运行时.就是系统在运行的时候的一些机制,其中最主要的是消息机制.对于C语言,函数的调用 在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 ) ...

随机推荐

  1. javaScript操作DOM对象(看三遍,敲三遍,写三遍! 不会你找我)!!

    DOM是Document Object Model的缩写,即文档对象模型,是基于文档编程的一套API 使用javaScript操作DOM对象通常分为三类:1.DOM CORE        2.HTM ...

  2. Discuz更改默认搜索模块

    由于网站使用DZ的侧重点不同,在搜索中可能需要更改默认搜索模块 首先找到模板中搜索模块对应的文件,默认模板中搜索模块的地址是 template\default\common\pubsearchform ...

  3. 推荐几个Dynamic Crm的大神博客

    ghostbear的博客:http://blog.csdn.net/ghostbear/article/category/1072859 ghostbear大神的博客是新手学习Dynamics Crm ...

  4. chrome谷歌浏览器-DevTool开发者工具-详细总结

    目录: 一.概述 1.官方文档 2.打开方法: 3.前言: 二.九个模块: 1.设备模式Device Mode 2.元素面板Elements 3.控制台面板Console 4.源代码面板Sources ...

  5. 初学MySQL

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.   Mysql默认端口号: 3306 超级用户:root   prompt 修改提示符. ( ...

  6. php对数组中的键与值进行合并处理

    $res=array(); $re=array_count_values($month); foreach( $re as $k=>$v){ $arr['month_name'] = strva ...

  7. 跨进程通信之Messenger

    1.简介 Messenger,顾名思义即为信使,通过它可以在不同进程中传递Message对象,通过在Message中放入我们需要的入局,就可以轻松实现数据的跨进程传递了.Messenger是一种轻量级 ...

  8. 利用java反射机制编写solr通用的java客户端

    一.前言 通过上一篇的讲解,我们知道了dynamicFiled字段,它是动态的,不需要显示的声明.而且一些常用的基本类型solr已经默认给我们创建好了. 例如:*_i,*_is,等. 如果我们要使用动 ...

  9. canvas学习总结五:线段的端点与连接点

    我们在第三节中描述了线段的绘制,其中线段的属性lineWidth是用来改变线段的宽度.让我们来回忆下线宽的用法 function drawLine(){ cxt.lineWidth = 3; cxt. ...

  10. Google调试工具

    f11 逐语句,到过程里,f10逐过程,跳到下一个off,f8调到下一个断点执行.