objective c Objective-C:重写动态获取器



dynamic override (1)

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

现在,我想为myProp定义一个getter(在返回myProp之后返回myProp ),而不改变对[myClass myProp]的各种调用。 即不创建一个名为getMyProp以外的getMyProp

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

谢谢,

阿克沙伊


Answer #1

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

- (id)primitiveValueForKey:(NSString *)键

- (void)setPrimitiveValue:(id)forKey的值:(NSString *)键

这通常用于将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)





getter