CALayer的子类VS类别

时间:2011-11-24 18:17:48

标签: objective-c subclass calayer categories

如果我将CALayer子类化并覆盖drawInContext:方法,那么一切都很棒。如果我为CALayer创建一个类别,我覆盖相同的方法(作为子类化的替代方法),它会被调用,但它不会绘制任何东西。当然,在这两种情况下都会调用[super drawInContext:ctx]。为什么?
我没有子类化的问题,我只是好奇为什么会发生这种情况。我的印象是,类别可以用于为任何类添加或覆盖方法,作为创建整个子类的替代方法。
谢谢!

1 个答案:

答案 0 :(得分:2)

在类别中调用super实现会在您具有该类别的对象的超类上调用它们,而不是您尝试执行的原始对象实现。

super,当在实例方法中的方法调用的上下文中使用时,调用超类的该方法的实现。

在某个类别中,您尚未创建子类 - 您编写的代码将直接由您具有该类别的类执行。因此,对super实现的调用将发送到CALayer的超类,即NSObject

因此,在类别中尝试此操作时,您没有收到编译器警告,我感到有些惊讶。

这里有更好的讨论:Is calling super in a category the same as calling it in a subclass?