Vous pouvez détourner les méthodes souhaitées sur UIResponder
pour ajouter la journalisation, puis appeler la méthode d'origine. Voici un exemple:
#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
Ensuite, quelque part dans votre application (je mets parfois en lui-même main()
), il suffit d'appeler [UIResponder hijack]
. Tant que la sous-classe UIResponder
appelle super
à un moment donné, votre code sera injecté.
method_exchangeImplementations()
est une belle chose. Soyez prudent avec cela bien sûr; C'est génial pour le débogage, mais très confus si utilisé sans discernement.
'NSNotificationCenter' →' self'? – zoul
@zoul. Désolé, ce code provient d'un détournement de NSNotificationCenter. Bonne prise. Fixé. –
Cela ne semble pas compiler pour iOS 3.2. Revendications que _Method_ n'existe pas (et les autres fonctions de réflexion que vous utilisez aussi). Une idée pourquoi? –