可能会告诉一个子类是否覆盖了一个方法?

问题描述:

在处理一个小项目时,我发现自己需要通过drawRect:在我的UIView子类中的一个中进行一些自定义绘图。我注意到,当我覆盖drawRect:时,UIView子类的默认背景颜色已从透明变为黑色(默认背景颜色是指视图在其属性为零时,视图自身绘制的颜色)。即使使用空drawRect:drawRect:那简直叫[super drawRect:]我注意到了这种行为。可能会告诉一个子类是否覆盖了一个方法?

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

这是非常奇怪的(但听起来像它的意图)。简单地添加:

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

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

UIView's documentation for -drawRect:详细了解子类别。它特别指出,在直接子类化UIView时,您不需要调用super,表明该类可能被优化为执行最少量的额外工作(如绘制完全在您的实现中完全消除的背景)。

+0

是的,令人惊讶的是,行为持续存在,即使只是简单地打电话给super。我愚蠢地忽略了obj-c运行时的可能性,因为我认为任何用于获取类的方法的函数都会考虑超类的方法(所以总会有一个drawRect:present)。但是class_copyMethodList (...,...)函数(也可能是其他函数)似乎排除了超类方法,所以我想UIView可以遍历该列表来查找drawRect:在子类中。那么我想问题是如果这确实发生了。非常感谢您的投入。 – Sam 2011-02-06 04:52:55