用runtime归档、解档、copy

我先定义一个TestModel

//

//ViewController.m

//CocoTest_1

//

//Created by S u p e r m a n on 2017/3/14.

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

//

#import"ViewController.h"

//

//TestModel.h

//runTime

//

//Created by apple on 16/5/27.

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

//

#import

#import

@interfaceTestModel :NSObject

@property(nonatomic,assign)floatheight;

@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

//

//TestModel.m

//runTime

//

//Created by apple on 16/5/27.

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

//

#import"TestModel.h"

@implementationTestModel

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

if(self= [superinit]) {

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

NSMutableArray* keys = [NSMutableArrayarray];

NSMutableArray* attributes = [NSMutableArrayarray];

//获得底层的属性列表

unsignedintoutCount =0;

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

for(inti =0; i

objc_property_tproperty = propertyList[i];

constchar*key =property_getName(property);

constchar*attribute =property_getAttributes(property);

[keysaddObject:[NSStringstringWithCString:keyencoding:NSUTF8StringEncoding]];

[attributesaddObject:[NSStringstringWithCString:attributeencoding:NSUTF8StringEncoding]];

}

free(propertyList);

//通过keys来赋值

for(NSString* keyinkeys) {

if(dict[key]) {

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

}

}

free(ivars);

}

returnself;

}

//解档

/*

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

**/

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

if(self= [superinit]) {

unsignedintoutCount =0;

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

for(inti =0; i

Ivarivar = ivars[i];

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

[selfsetValue:[aDecoderdecodeObjectForKey:key]forKey:key];

}

free(ivars);

}

returnself;

}

/*

*归档

**/

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

unsignedintoutCount;

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

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

Ivarivar = ivars[i];

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

[aCoderencodeObject:[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 ++) {

Ivarivar = ivars[i];

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

idvalue = [selfvalueForKey:key];

[copysetValue:valueforKey:key];

}

free(ivars);

returncopy;

}

@end

你可能感兴趣的:(用runtime归档、解档、copy)