zoukankan      html  css  js  c++  java
  • 自动序列化

    转来一个自动序列化的 关于NSObject的类目

    自动序列化(转)

     

    #import "NSObject+AutoEncodeDecode.h"

    @implementation NSObject (AutoEncodeDecode)

    - (void)encodeWithCoder:(NSCoder *)encoder {

        Class cls = [selfclass];

        while (cls != [NSObjectclass]) {

            unsigned int numberOfIvars =0;

            Ivar* ivars = class_copyIvarList(cls, &numberOfIvars);

            for(const Ivar* p = ivars; p < ivars+numberOfIvars; p++){

                Ivar const ivar = *p;

                const char *type =ivar_getTypeEncoding(ivar);

                NSString *key = [NSStringstringWithUTF8String:ivar_getName(ivar)];

                id value = [selfvalueForKey:key];

                if (value) {

                    switch (type[0]) {

                        case _C_STRUCT_B: {

                            NSUInteger ivarSize =0;

                            NSUInteger ivarAlignment =0;

                            NSGetSizeAndAlignment(type, &ivarSize, &ivarAlignment);

                            NSData *data = [NSDatadataWithBytes:(constchar *)self + ivar_getOffset(ivar)

                                                          length:ivarSize];

                            [encoder encodeObject:dataforKey:key];

                        }

                            break;

                        default:

                            [encoder encodeObject:value

                                           forKey:key];

                            break;

                    }

                }

            }

            free(ivars);

            cls = class_getSuperclass(cls);

        }

    }

     

    - (id)initWithCoder:(NSCoder *)decoder {

        self = [self init];

        

        if (self) {

            Class cls = [selfclass];

            while (cls != [NSObjectclass]) {

                unsigned int numberOfIvars =0;

                Ivar* ivars = class_copyIvarList(cls, &numberOfIvars);

                

                for(constIvar* p = ivars; p < ivars+numberOfIvars; p++){

                    Ivar const ivar = *p;

                    const char *type =ivar_getTypeEncoding(ivar);

                    NSString *key = [NSStringstringWithUTF8String:ivar_getName(ivar)];

                    id value = [decoder decodeObjectForKey:key];

                    if (value) {

                        switch (type[0]) {

                            case _C_STRUCT_B: {

                                NSUInteger ivarSize =0;

                                NSUInteger ivarAlignment =0;

                                NSGetSizeAndAlignment(type, &ivarSize, &ivarAlignment);

                                NSData *data = [decoderdecodeObjectForKey:key];

                                char *sourceIvarLocation = (char*)self+ivar_getOffset(ivar);

                                [data getBytes:sourceIvarLocationlength:ivarSize];

                            }

                                break;

                            default:

                                [self setValue:[decoder decodeObjectForKey:key]

                                        forKey:key];

                                break;

                        }

                    }

                }

                free(ivars);

                cls = class_getSuperclass(cls);

            }

        }

        

        return self;

    }

  • 相关阅读:
    JavaScript算法学习:获取字符串最后一位方法及判断是否以指定字符串开始或结尾
    前端基础知识学习笔记
    JavaScript算法练习:找出字符串中最长的单词并输出其长度
    HTML+CSS学习笔记
    Mint-ui中loadmore(上拉加载下拉刷新)组件在ios中滑动会触发点击事件的解决方法
    JavaScript中的DOM,BOM详细介绍;
    web前端面试题目整理
    Charles https乱码处理
    String类的三个参数的构造方法
    java.net包中的URL类
  • 原文地址:https://www.cnblogs.com/lingzhiguiji/p/3696622.html
Copyright © 2011-2022 走看看