我试图弄清楚事情是如何工作的。因此,我认为当我使用类别覆盖某些方法时,我会得到有趣的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/