Objective-C:覆盖动态getter

Aks*_*hay 6 getter overriding dynamic objective-c

我有一个属性的NSManagedObject子类,它被定义.通过我的代码中有各种读取实例.MyClassmyProp@dynamicmyProp[myClass myProp]

现在,我想定义一个getter(myProp在向它添加内容后返回)myProp,而不更改对[myClass myProp]的各种调用.即没有创建一个名为其他东西的getter getMyProp.

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

谢谢,

阿克沙伊

Mik*_*ler 17

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

- (id)primitiveValueForKey:(NSString*)键

- (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];
}
Run Code Online (Sandbox Code Playgroud)

willAccessValueForKey:didAccessValueForKey:需要由基础管理对象类用于处理故障和关系等.

如果你最终编写了一个setter,你还必须用KVC方法包装访问器:

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

话虽如此,我个人不建议您保留相同的方法名称,除非您有充分的理由.对于"派生"值,您通常希望创建一个具有不同名称的全新方法.在整个代码中快速查找/替换不需要很长时间.

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

  • 嘿,这个人现在已经有几个月了,但是,你的榜样不应该是"setIsShared"(不是"setShared")吗?只是想确保我不会误解某些东西. (6认同)