- (void)encodeWithCoder:(NSCoder *)encoder { // 利用runtime获取实例变量的列表 [self encodeWithClass:[self class] coder:encoder]; } - (void)encodeWithClass:(Class)class coder:(NSCoder *)encoder { NSString *class_string = NSStringFromClass(class); if (![class_string isEqualToString:@"NSObject"]) { id obj = [class new]; [self encodeWithClass:[obj superclass] coder:encoder]; } else { return; } unsigned int count = 0; Ivar *ivars = class_copyIvarList(class, &count); for (int i = 0; i < count; i ++) { // 取出i位置对应的实例变量 Ivar ivar = ivars[i]; // 查看实例变量的名字 const char *name = ivar_getName(ivar); // C语言字符串转化为NSString NSString *nameStr = [NSString stringWithCString:name encoding:NSUTF8StringEncoding]; // 利用KVC取出属性对应的值 id value = [self valueForKey:nameStr]; // 归档 [encoder encodeObject:value forKey:nameStr]; } // 记住C语言中copy出来的要进行释放 free(ivars); } - (id)initWithCoder:(NSCoder *)decoder { if (self = [super init]) { [self deCoderWithClass:[self class] coder:decoder]; } return self; } - (void)deCoderWithClass:(Class)class coder:(NSCoder *)decoder { NSString *class_string = NSStringFromClass(class); if (![class_string isEqualToString:@"NSObject"]) { id obj = [class new]; [self deCoderWithClass:[obj superclass] coder:decoder]; } else return; unsigned int count = 0; Ivar *ivars = class_copyIvarList(class, &count); for (int i = 0; i < count; i ++) { Ivar ivar = ivars[i]; const char *name = ivar_getName(ivar); // NSString *key = [NSString stringWithCString:name encoding:NSUTF8StringEncoding]; id value = [decoder decodeObjectForKey:key]; // 设置到成员变量身上 [self setValue:value forKey:key]; } free(ivars); } 参考:http://blog.csdn.net/oqingting12345/article/details/48929491