Objective-C:重载动态getter



我有一个NSManagedObject子类MyClass,其属性为myProp,定义为@dynamic。在我的代码中有很多通过[myClass myProp]读取myProp的实例。

现在,我想为myProp定义一个getter(在附加一些东西后返回myProp),而不改变对[myClass myProp]的各种调用。也就是说,不需要创建一个命名为getMyProp以外的getter。

我的问题是,如果我创建一个getter getMyProp,这将覆盖由NSManagedObject创建的getter,我如何访问存储在数据库中的原始值?

要访问托管对象的底层值,可以使用以下两个方法:

- (id) primartivevalueforkey:(NSString *)key

- (void)setPrimitiveValue:(id)value forKey:(NSString *)key

这通常用于将NSNumber属性转换为它们的"real"类型,例如bool属性:

- (BOOL)isShared
{
    [self willAccessValueForKey:@"isShared"];
    NSNumber *underlyingValue = [self primitiveValueForKey:@"isShared"];
    [self didAccessValueForKey:@"isShared"];
    return [underlyingValue boolValue];
}

willAccessValueForKey:didAccessValueForKey:是底层管理对象类处理错误和关系等所需要的。

如果要编写setter,还必须将访问器包装在KVC方法中:

- (void)setShared:(BOOL)isShared
{
    NSNumber *newUnderlyingValue = [NSNumber numberWithBool:isShared];
    [self willChangeValueForKey:@"isShared"];
    [self setPrimitiveValue:newUnderlyingValue forKey:@"isShared"];
    [self didChangeValueForKey:@"isShared"];
}

说了这些,我个人不建议你保持相同的方法名称,除非你有一个很好的理由。对于"派生"值,你通常想用不同的名字创建一个全新的方法。在整个代码中快速查找/替换并不需要很长时间。

编辑:添加willAccessValueForKey:/didAccessValueForKey:(谢谢jrturton)

最新更新