- (void)encodeWithCoder:(NSCoder *)encoder {
Class cls = [self class];
while (cls != [NSObject class]) {
unsigned int numberOfIvars = 0;
Ivar *ivars = class_copyIvarList(cls, &numberOfIvars);
for (int i = 0; i < numberOfIvars; ++i) {
const char *type = ivar_getTypeEncoding(ivars[i]);
NSString *key = [NSString stringWithUTF8String:ivar_getName(ivars[i])];
if (key == nil || key.length == 0) {
continue;
}
id value = [self valueForKey:key];
if (value) {
switch (type[0]) {
case _C_STRUCT_B: {
NSUInteger ivarSize = 0;
NSUInteger ivarAlignment = 0;
NSGetSizeAndAlignment(type, &ivarSize, &ivarAlignment);
NSData *data = [NSData dataWithBytes:(const char *)self + ivar_getOffset(ivars[i]) length:ivarSize];
[encoder encodeObject:data forKey:key];
} break;
default:
[encoder encodeObject:value forKey:key];
break;
}
}
}
if (ivars) {
free(ivars);
}
cls = class_getSuperclass(cls);
}
}
- (id)initWithCoder:(NSCoder *)decoder {
self = [super init];
if (self) {
Class cls = [self class];
while (cls != [NSObject class]) {
unsigned int numberOfIvars = 0;
Ivar *ivars = class_copyIvarList(cls, &numberOfIvars);
for (int i = 0; i < numberOfIvars; ++i) {
const char *type = ivar_getTypeEncoding(ivars[i]);
NSString *key = [NSString stringWithUTF8String:ivar_getName(ivars[i])];
if (key == nil || key.length == 0) {
continue;
}
id value = [decoder decodeObjectForKey:key];
if (value) {
switch (type[0]) {
case _C_STRUCT_B: {
NSUInteger ivarSize = 0;
NSUInteger ivarAlignment = 0;
NSGetSizeAndAlignment(type, &ivarSize, &ivarAlignment);
NSData *data = [decoder decodeObjectForKey:key];
char *sourceIvarLocation = (char *)self + ivar_getOffset(ivars[i]);
[data getBytes:sourceIvarLocation length:ivarSize];
memcpy((char *)self + ivar_getOffset(ivars[i]), sourceIvarLocation, ivarSize);
} break;
default:
[self setValue:value forKey:key];
break;
}
}
}
if (ivars) {
free(ivars);
}
cls = class_getSuperclass(cls);
}
}
return self;
}
利用runtime进行归档解
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...