Вы можете сделать это, но не используя категорию.Категория заменяет метод.(Предупреждение, аналогия с автомобилем) Если у вас есть машина, и вы уничтожаете эту машину и заменяете ее новой, можете ли вы по-прежнему использовать старую машину?Нет, потому что он ушел и больше не существует.То же самое с категориями.
Что вы можете сделать, это использовать среду выполнения 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);