Objective-C: 覆盖动态getter

问题描述 投票:6回答:1

我有一个 NSManagedObject 子类 MyClass 带着财产 myProp,其定义为 @dynamic. 有各种读法 myProp 在我的代码中,通过 [myClass myProp].

现在,我想定义一个getter(返回到 myProp 后)对于 myProp也就是说,不需要创建一个名字为 "myClass myProp "以外的getter。getMyProp.

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

objective-c dynamic overriding getter
1个回答
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];
}

The willAccessValueForKey:didAccessValueForKey: 是底层管理对象类所需要的,用于处理故障和关系等。

而且如果你最终确实写了一个setter,你也必须用KVC方法来包装访问器。

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

说到这里,我个人不建议你保持相同的方法名,除非你有一个很好的理由。对于 "派生 "的值,你一般要创建一个全新的方法,并使用不同的名称。在你的整个代码中做一个快速的findreplace并不需要很长时间。

EDIT: 添加了 willAccessValueForKey:didAccessValueForKey。(thanks jrturton)

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.