可以判断一个子类是否覆盖了一个方法?

时间:2011-02-06 02:19:44

标签: objective-c uiview objective-c-runtime

在处理一个小项目时,我发现自己需要在drawRect:个子类中通过UIView进行自定义绘图。我注意到当我覆盖drawRect:时,UIView子类的默认背景颜色已从透明变为黑色(默认情况下,背景颜色是指视图在其backgroundColor属性时绘制的颜色是零。)即使只是调用drawRect:的空drawRect:[super drawRect:],我也注意到了这种行为。

这不是一个真正的问题,因为简单地将backgroundColor设置为非零值无论是否覆盖drawRect:都有效。但是,它确实让我开始思考UIView如何知道drawRect:是否被子类覆盖。我知道Objective-C提供了一些工具来确定一个类甚至它的超类是否响应某个选择器。但是超类怎么可能知道它的子类是否覆盖了它的一个方法呢?而且,如果这种内省确实不可能,我的例子中可能会发生什么?

1 个答案:

答案 0 :(得分:0)

这很奇怪(但听起来像是有意的)。只需添加:

- (void) drawRect:...
{
    [super drawRect:...];
}

触发行为?非典型。无论如何,使用Objective-C运行时API来彻底地内省类实现细节是微不足道的。请参阅Objective-C runtime reference.

UIView's documentation for -drawRect:详细介绍了子类化。它非常明确地说明在直接子类化UIView时你不需要调用super,这表明该类可能已经过优化以完成最少量的额外工作(比如绘制一个完全在你的实现中被删除的背景)