用runtime归档、解档、copy

//

//  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)