2009-12-18 5 views
3

J'essaie de déboguer quelques touchesBegan/Moved/Ended liées ralentissement dans mon jeu; Je pense que certains de mes répondeurs tactiles ne déchargent pas correctement, et donc que le jeu fonctionne de plus en plus d'entre eux s'empilent et les contacts deviennent moins réactifs parce qu'ils doivent traverser une chaîne de réponse de plus en plus grande.Existe-t-il un moyen de récupérer tous les répondeurs qui ont traité un UITouch?

Existe-t-il un moyen d'afficher/de récupérer le chemin emprunté par un UITouch lorsqu'il se déplace dans la chaîne? Ou simplement un moyen de récupérer une liste de tous les répondeurs actifs?

Merci, S

Répondre

5

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.

+0

'NSNotificationCenter' →' self'? – zoul

+0

@zoul. Désolé, ce code provient d'un détournement de NSNotificationCenter. Bonne prise. Fixé. –

+0

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? –

1

je regarderais dans votre utilisation de la mémoire, plutôt que d'essayer de récupérer tous les intervenants. Soit regarder dans les instruments http://www.mobileorchard.com/find-iphone-memory-leaks-a-leaks-tool-tutorial/ ou inversement, juste jeter quelques NSLog(@"responded"); dans vos méthodes touchesBegan et voir si elle se connecte comme dix fois pour chaque contact.