Objective-C:覆盖动态 setter/getter

标签 objective-c dynamic overriding getter

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

现在,我想为 myProp 定义一个 getter(在向其附加内容后返回 myProp),而不更改对 [myClass myProp] 的各种调用。即不创建名为 getMyProp 之外的其他名称的 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:覆盖动态 setter/getter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7403999/

相关文章:

ios - Xcode-7.0.1 : Presenting view controllers on detached view controllers is discouraged

iphone - 你能在 Cocoa Touch 中获得系统接听电话按钮吗?

iphone - 我可以将 ObjectiveC @selector 放入 NSDictionary 中吗?

ios - 为什么允许在实现内部的@interface中重写ivar,但是具有这种奇怪的行为?

java - 有没有办法重写 MenuItemActionPerformed 中的 PaintComponent 方法?

ios - 给MKMapView添加注解时出现EXC_BAD_ACCESS错误

ios - 如何以编程方式打开 UINavigationController

jquery - 为什么我的动态 HTML 看似随机放置?

c - 在 C 中动态创建一个 TYPE 数组

重写方法的 C# 可选参数