美文网首页程序员
用runtime归档、解档、copy

用runtime归档、解档、copy

作者: 路灯下的黑猫 | 来源:发表于2018-09-27 11:08 被阅读6次

    //

    //  TestModel.h

    //  Test

    //

    //  Created by 路灯下的黑猫 on 2018/9/27.

    //  Copyright © 2018年 张浩. All rights reserved.

    //

    #import

    #import

    NS_ASSUME_NONNULL_BEGIN

    @interfaceTestModel : NSObject

    @property (nonatomic,assign) float height;

    @property (nonatomic,strong) NSArray * dataArr;

    @property (nonatomic,retain) NSArray * dataArr1;

    @property (nonatomic,copy) NSString * name;

    @property (nonatomic,retain) NSString * name2;

    - (instancetype)initWithDict:(NSDictionary *)dict;

    @end

    NS_ASSUME_NONNULL_END

    //

    //  TestModel.m

    //  Test

    //

    //  Created by 路灯下的黑猫 on 2018/9/27.

    //  Copyright © 2018年 张浩. All rights reserved.

    //

    #import "TestModel.h"

    @implementation TestModel

    - (instancetype)initWithDict:(NSDictionary *)dict {

        if(self= [superinit]) {

            //1.获取类的属性及属性对应的类型

            NSMutableArray * keys = [NSMutableArray array];

            NSMutableArray * attributes = [NSMutableArray array];

            //获得底层的属性列表

            unsignedintoutCount =0;

            objc_property_t *propertyList = class_copyPropertyList([selfclass], &outCount);

            for(inti =0; i

                objc_property_t property = propertyList[i];

                constchar*key = property_getName(property);

                constchar*attribute = property_getAttributes(property);

                [keys addObject:[NSString stringWithCString:key encoding:NSUTF8StringEncoding]];

                [attributes addObject:[NSString stringWithCString:attribute encoding:NSUTF8StringEncoding]];

            }

            free(propertyList);

            //通过keys 来赋值

            for(NSString * keyinkeys) {

                if(dict[key]) {

                    [selfsetValue:dict[key] forKey:key];

                }

            }

        }

        return self;

    }

    //解档

    /*

     * 通过归档来初始化,也就是把这个归档来解出来

     **/

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

        if(self= [superinit]) {

            unsignedintoutCount =0;

            Ivar * ivars = class_copyIvarList([selfclass], &outCount);

            for(inti =0; i

                Ivar ivar = ivars[i];

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

                [selfsetValue:[aDecoder decodeObjectForKey:key] forKey:key];

            }

            free(ivars);

        }

        return self;

    }

    /*

     * 归档

     **/

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

        unsignedintoutCount;

        Ivar * ivars = class_copyIvarList([selfclass], &outCount);

        for(inti =0; i < outCount; i ++) {

            Ivar ivar = ivars[i];

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

            [aCoder encodeObject:[selfvalueForKey:key] forKey:key];

        }

    }

    /*

     实现copy 协议

     **/

    - (id)copyWithZone:(NSZone *)zone {

        idcopy = [[[selfclass]allocWithZone:zone]init];

        unsignedintoutCount;

        Ivar * ivars = class_copyIvarList([selfclass], &outCount);

        for(inti =0; i < outCount; i ++) {

            Ivar ivar = ivars[i];

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

            idvalue = [selfvalueForKey:key];

            [copy setValue:value forKey:key];

        }

        free(ivars);

        returncopy;

    }

    @end

    相关文章

      网友评论

        本文标题:用runtime归档、解档、copy

        本文链接:https://www.haomeiwen.com/subject/jffeoftx.html