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

现在,我想为myProp定义一个 setter/getter (在附加一些东西后返回myProp),而不更改对[myClass myProp]的各种调用。即没有创建名为getMyProp以外的名称的 setter/getter 。

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

最佳答案

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

- (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)

关于objective-c - Objective-C:覆盖动态 getter ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7403999/

10-14 20:51