Objective c 目标C:覆盖动态getter

Objective c 目标C:覆盖动态getter,objective-c,dynamic,overriding,getter,Objective C,Dynamic,Overriding,Getter,我有一个NSManagedObject子类MyClass,其属性为myProp,定义为@dynamic。通过[myClass myProp]在我的代码中有各种读取myProp的实例 现在,我想为myProp定义一个getter(在附加一些内容后返回myProp),而不改变对[myClass myProp]的各种调用。i、 e.不创建名为非getMyProp的getter 我的问题是,如果我创建一个gettergetMyProp,它将覆盖由NSManagedObject创建的getter,我如何访

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

现在,我想为
myProp
定义一个getter(在附加一些内容后返回
myProp
),而不改变对[myClass myProp]的各种调用。i、 e.不创建名为非
getMyProp
的getter


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

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

这通常用于将NSNumber属性转换为其“实”类型,例如布尔属性:

- (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"];
}
话虽如此,我个人不建议您保留相同的方法名称,除非您有充分的理由。对于“派生”值,您通常希望创建一个具有不同名称的全新方法。在整个代码中快速查找/替换并不需要很长时间


编辑:added willAccessValueForKey:/didAccessValueForKey:(谢谢jrturton)

您是否还需要将getter代码与
willAccessValueForKey:
didAccessValueForKey:
括在一起,以确保在必要时触发错误?嘿,这一个错误已经存在几个月了,但是,您的示例设置程序不应该是“setIsShared”(不是我只是想确定我没有误解什么。