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. 快速上手 Kotlin 的 11 招

    本文转载自 Kotlin 公众号(KotlinX) 作者:bennyhuo 最近经常会收到一些 "用 Kotlin 怎么写" 的问题,作为有经验的程序员,我们已经掌握了一门或者多门 ...

  2. angular.js的ng-app 指令定义一个 AngularJS 应用程序。

    <!DOCTYPE html> <html lang="en" ng-app> <head> <meta charset="UT ...

  3. Bash中的数学扩展

    Bash只支持整数运算,不支持浮点运算.如果需要进行浮点运算,需要使用bc程序.Bash中的数学扩展有两种形式:$[ expression ]或$(( expression )) 例子:$echo $ ...

  4. Navicat连接报错:cannot load OCI DLL,126

    32位系统下报错:cannot load OCI DLL,126 解决方法:navicat 菜单中 -工具->选项->OCI 选择oracle安装目录下bin里面的oci.dll 在win ...

  5. python 标准库 -- pickle & cPickle

    pickle & cPickle pickle 和 cPickle 除了导入名称不一样之外, 使用方法, 均一样. pickle 导入 import pickle cPickle 导入 imp ...

  6. webpack3新特性介绍

    6月20号webpack推出了3.0版本,官方也发布了公告.根据公告介绍,webpack团队将未来版本的改动聚焦在社区提出的功能需求,同时将保持一个快速.稳定的发布节奏.本文主要依据公告内容,简单介绍 ...

  7. select onchagnge 弹出自己的文本值

    select onchagnge 弹出自己的文本值onchange='alert($("option:selected",this).text())'

  8. php产生随机字符串

    /** * 产生随机字符串 * * @param int $length 输出长度 * @param string $chars 可选的 ,默认为 0123456789 * @return strin ...

  9. SQL SERVER查看索引使用情况

    SELECT DISTINCT DB_NAME() AS N'db_name' , E.name AS N'schema_name' , OBJECT_NAME(a.object_id) AS N't ...

  10. Delegate(委托)

    在前面lambda章节中稍微提了一下委托,今天这章就让我们来深究一下委托. 委托的本质是一种类,他是继承MulticastDelegate类的. 而声明委托的关键字的delegate,如:public ...