如果我将CALayer
子类化并覆盖drawInContext:
方法,那么一切都很棒。如果我为CALayer
创建一个类别,我覆盖相同的方法(作为子类化的替代方法),它会被调用,但它不会绘制任何东西。当然,在这两种情况下都会调用[super drawInContext:ctx]
。为什么?
我没有子类化的问题,我只是好奇为什么会发生这种情况。我的印象是,类别可以用于为任何类添加或覆盖方法,作为创建整个子类的替代方法。
谢谢!
答案 0 :(得分:2)
在类别中调用super
实现会在您具有该类别的对象的超类上调用它们,而不是您尝试执行的原始对象实现。
super
,当在实例方法中的方法调用的上下文中使用时,调用超类的该方法的实现。
在某个类别中,您尚未创建子类 - 您编写的代码将直接由您具有该类别的类执行。因此,对super
实现的调用将发送到CALayer
的超类,即NSObject
。
因此,在类别中尝试此操作时,您没有收到编译器警告,我感到有些惊讶。
这里有更好的讨论:Is calling super in a category the same as calling it in a subclass?