利用runtime实现NSCoding协议

项目可能有这种需求: 有一个自定义对象需要归档,但是这个对象属性含有其它自定义对象,其它自定义对象内部又有其它自定义对象,这些对象属性还比较多,而且属性类型有对象类型也含有很多基本数据类型例如BOOL,NSInteger,dounle,float等

想要归档这些对象,肯定逐个实现每个对象的NSCoding协议.
但是手动一个个去实现,肯定不可取,工程量大且不说,维护成本也很高,每次新增属性都得去修改NSCoding协议方法的实现.

所以最好的方式就是使用runtime.

@protocol NSCoding

- (void)encodeWithCoder:(NSCoder *)aCoder;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder; // NS_DESIGNATED_INITIALIZER

@end

网上大部分使用runtime去实现NSCoding都是不完善的: 大部分不支持基本数据类型;
其实YYKit框架已经提供了强大的功能: 支持任意类型
而且还支持对象hash和isEqual方法

@interface YYShadow :NSObject 
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) CGSize size;
@end

@implementation YYShadow
- (void)encodeWithCoder:(NSCoder *)aCoder {
    [self modelEncodeWithCoder:aCoder];
}

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super init];
    return [self modelInitWithCoder:aDecoder];
}

- (id)copyWithZone:(NSZone *)zone {
    return [self modelCopy];
}

- (NSUInteger)hash {
    return [self modelHash];
}

- (BOOL)isEqual:(id)object {
    return [self modelIsEqual:object];
}
@end

你可能感兴趣的:(利用runtime实现NSCoding协议)