我试图弄清楚事情是如何工作的。因此,我认为当我使用类别覆盖某些方法时,我会得到有趣的NSLogs。

@implementation UIView(Learning)
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    NSLog(@"-hitTest:withEvent: event=%@", event);
    return [self hitTest:point withEvent:event];
}
@end

super 和自我在这里不起作用。有没有办法调用-hitTest:withEvent:的原始实现?我想要的是每次在UIView上调用-hitTest:withEvent:时都需要一个NSLog。

这只是出于个人学习目的。我想查看事件的交付情况。

最佳答案

您可以执行此操作,但不能使用类别。类别代替了方法。 (警告,类比汽车)如果您有汽车,然后销毁了那辆汽车,然后换了新车,您还能使用旧车吗?不,因为它已经消失并且不再存在。与类别相同。

您可以做的是使用Objective-C运行时在运行时以其他名称添加方法(例如,“bogusHitTest:withEvent:”),然后交换hitTest:withEvent:bogusHitTest:withEvent:的实现。这样,当代码调用hitTest:withEvent:时,它将执行最初为bogusHitTest:withEvent:编写的代码。然后,您可以让该代码调用bogusHitTest:withEvent:,它将执行原始的实现。

因此,伪造方法将如下所示:

- (UIView *) bogusHitTest:(CGPoint)point withEvent:(UIEvent *)event {
  NSLog(@"executing: %@", NSStringFromSelector(_cmd));
  return [self bogusHitTest:point withEvent:event];
}

交换方法的代码如下:
Method bogusHitTest = class_getInstanceMethod([UIView class], @selector(bogusHitTest:withEvent:));
Method hitTest = class_getInstanceMethod([UIView class], @selector(hitTest:withEvent:));
method_exchangeImplementations(bogusHitTest, hitTest);

关于ios - 用类别覆盖方法时如何调用原始实现?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4294753/

10-11 01:48