Вы можете перехватить нужные методы на UIResponder
, чтобы добавить протоколирование, а затем вызвать оригинальный метод. Вот пример:
#import <objc/runtime.h>
@interface UIResponder (MYHijack)
+ (void)hijack;
@end
@implementation UIResponder (MYHijack)
+ (void)hijackSelector:(SEL)originalSelector withSelector:(SEL)newSelector
{
Class class = [UIResponder class];
Method originalMethod = class_getInstanceMethod(class, originalSelector);
Method categoryMethod = class_getInstanceMethod(class, newSelector);
method_exchangeImplementations(originalMethod, categoryMethod);
}
+ (void)hijack
{
[self hijackSelector:@selector(touchesBegan:withEvent:) withSelector:@selector(MYHijack_touchesBegan:withEvent:)];
}
- (void)MYHijack_touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"touches!");
[self MYHijack_touchesBegan:touches withEvent:event]; // Calls the original version of this method
}
@end
Затем где-нибудь в вашем приложении (я иногда помещаю его в main()
), просто позвоните [UIResponder hijack]
. Пока подкласс UIResponder
вызывает super
в какой-то момент, ваш код будет введен.
method_exchangeImplementations()
прекрасная вещь. Будьте осторожны с этим, конечно; отлично подходит для отладки, но очень запутанно, если используется без разбора.