Есть ли способ получить каждый респондент, который обработал UITouch? - PullRequest
3 голосов
/ 18 декабря 2009

Я пытаюсь отладить некоторые касания замедления, связанные с Began / Moved / Ended в моей игре; Я думаю, что некоторые из моих сенсорных ответчиков не разгружаются должным образом, и, так как игра запускается, все больше и больше из них складываются, и касания становятся менее отзывчивыми, потому что им приходится проходить через все большую и большую цепочку ответчиков.

Есть ли какой-нибудь способ просмотреть / получить путь, пройденный UITouch, когда он движется по цепочке? Или просто каким-то образом получить список всех активных респондентов?

Спасибо, -S

Ответы [ 2 ]

5 голосов
/ 18 декабря 2009

Вы можете перехватить нужные методы на 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() прекрасная вещь. Будьте осторожны с этим, конечно; отлично подходит для отладки, но очень запутанно, если используется без разбора.

1 голос
/ 18 декабря 2009

Я бы посмотрел на использование вашей памяти, а не пытался получить все ответчики. Либо посмотрите на инструменты http://www.mobileorchard.com/find-iphone-memory-leaks-a-leaks-tool-tutorial/ или, наоборот, просто добавьте несколько NSLog(@"responded"); в ваши методы touchesBegan и посмотрите, регистрируется ли это как десять раз за каждое касание.

...