通過runtime筏餐,不管模型有多少屬性抬驴,通過幾句代碼就能完成炼七。
假設person類有N多個屬性而是(這里隨便寫3個)
.h
#import
@interfacePerson : NSObject
@property(nonatomic, assign) intage;
@property(nonatomic, assign) intheight;
@property(nonatomic, copy)NSString*name;
@end
.m
#import "Person.h"
#import
#import
@implementationMJPerson
- (void)encodeWithCoder:(NSCoder *)encoder
{
unsignedint count = 0;
Ivar *ivars =class_copyIvarList([Personclass], &count);
for (int i = 0; i
//取出i位置對應的成員變量
Ivar ivar = ivars[i];
//查看成員變量
constchar *name =ivar_getName(ivar);
//歸檔
NSString *key = [NSStringstringWithUTF8String:name];
id value = [selfvalueForKey:key];
[encoderencodeObject:valueforKey:key];
}
free(ivars);
}
- (id)initWithCoder:(NSCoder *)decoder
{
if (self = [superinit]) {
unsignedint count = 0;
Ivar *ivars =class_copyIvarList([Personclass], &count);
for (int i = 0; i
//取出i位置對應的成員變量
Ivar ivar = ivars[i];
//查看成員變量
constchar *name =ivar_getName(ivar);
//歸檔
NSString *key = [NSStringstringWithUTF8String:name];
id value = [decoderdecodeObjectForKey:key];
//設置到成員變量身上
[selfsetValue:valueforKey:key];
}
free(ivars);
}
returnself;
}
@end
這樣寫完后饼暑,不管屬性的多少期虾,runtime都能夠完成模型屬性的歸檔與解檔驴一,是不是很方便呢慌植。
當然甚牲,還可以把.h和.m里面的代碼抽成宏义郑,這樣以后想要實現復雜對象的存儲只需要寫兩行代碼就能搞定。