Objective-C:覆盖动态getter

时间:2011-09-13 14:58:32

标签: objective-c dynamic override getter

我有一个NSManagedObject子类MyClass,其属性myProp,定义为@dynamic。我的代码中有myProp通过[myClass myProp]阅读myProp的各种情况。

现在,我想定义一个getter(在为myProp添加内容之后返回getMyProp),而不会更改对[myClass myProp]的各种调用。即,不创建名为getMyProp以外的其他东西的吸气剂。

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

谢谢,

阿克沙伊

1 个答案:

答案 0 :(得分:17)

要访问托管对象的基础值,请使用以下两种方法:

- (id)primitiveValueForKey:(NSString *)key

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

这通常用于将NSNumber属性转换为“真实”类型,例如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)