- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self=[self init];if(self) {
unsignedintcount;
Ivar*varArray = class_copyIvarList([self class], &count);for (int i = 0; i < count; i++) {
Ivar var=varArray[i];const char *cName = ivar_getName(var); //属性名c字符串
NSString *proName = [[NSString stringWithUTF8String:cName] substringFromIndex:1]; //OC字符串,并且去掉下划线 _
const char *cType = ivar_getTypeEncoding(var); //获取变量类型,c字符串
NSString *proType = [NSString stringWithUTF8String:cType]; //oc 字符串
if ([proType containsString:@"NSString"]) {
proType=stringType;
}if ([proType containsString:@"NSNumber"]) {
proType=numberType;
}if ([proType containsString:@"NSArray"]) {
proType=arrayType;
}if ([proType containsString:@"UIImage"]) {
proType=imageType;
}if ([proType isEqualToString:intType] || [proType isEqualToString:boolType] ||[proType isEqualToString:BoolType]) {
int32_t number=[aDecoder decodeInt32ForKey:proName];
[self setValue:@(number) forKey:proName];
}else if([proType isEqualToString:longTpye]) {
int64_t number=[aDecoder decodeInt64ForKey:proName];
[self setValue:@(number) forKey:proName];
}else if([proType isEqualToString:floatType]) {float number =[aDecoder decodeFloatForKey:proName];
[self setValue:@(number) forKey:proName];
}else if ([proType isEqualToString:longlongType] ||[proType isEqualToString:doubleType]) {double number =[aDecoder decodeFloatForKey:proName];
[self setValue:@(number) forKey:proName];
}else if ([proType isEqualToString:stringType]) { //string 类型
NSString *string =[aDecoder decodeObjectForKey:proName];
[self setValue:stringforKey:proName];
}else if([proType isEqualToString:numberType]) {
NSString*number =[aDecoder decodeObjectForKey:proName];
[self setValue:number forKey:proName];
}else if([proType isEqualToString:arrayType]) {
NSArray*array =[aDecoder decodeObjectForKey:proName];
[self setValue:array forKey:proName];
}else if ([proType isEqualToString:imageType]) { //image 类型
UIImage *image =[UIImage imageWithData:[aDecoder decodeDataObject]];
[self setValue:image forKey:proName];
}
}
}returnself;
}