Objective-C如何处理具有相同属性名称的子类和超类?

时间:2014-09-29 16:32:53

标签: objective-c core-data ios8

在iOS 8 NSManagedObject中获得了一个新属性:

@property (nonatomic, getter=isDeleted, readonly) BOOL deleted;

不幸的是,我已经在NSManagedObject的子类中使用了同名的属性来将对象标记为软删除。

@property (nonatomic, retain) NSNumber *deleted; // BOOL in CoreData model

这导致大量编译器警告:

'getter' attribute on property 'deleted' does not match the property inherited from 'NSManagedObject'

Objective-C如何处理具有相同属性的超类和子类?我显然计划全面重命名这个属性,但是这个应用程序已经存在多个版本,我很好奇它的含义。

1 个答案:

答案 0 :(得分:1)

@property访问器只是常规方法,因此它们的处理方式与其他方法完全相同。在这种情况下,我相信你很幸运,因为框架(NSManagedObject)getter是-isDeleted而不是-deleted。由于您的子类实现了-deleted,因此技术上与getter没有冲突。

现在,真正的问题是,如果NSManagedObject在内部实现相应的-setDeleted: setter,那么将调用该方法的子类实现,而不是NSManagedObject的实现。使用-instancesRespondToSelector:快速检查似乎表明NSManagedObject实际上没有实现-setDeleted:(无论如何,在OS X上)。所以,你可能没事。

这样的冲突对您的应用程序的实际影响(假设您如上所述不幸运的情况)我不清楚,不知道您的应用程序正在做什么或为什么。对于它的价值,NSManagedObject上的-isDeleted方法根本不是新的。它被简单地提升为iOS 8中声明的@property(可能是为了简化Swift的互操作性)。拥有自己的deleted属性......

可能总是一个坏主意