Есть ли способ получить каждого ответчика, который обработал UITouch?
Вопрос
Я пытаюсь отладить некоторые касания, связанные с начавшимся / перенесенным / завершившимся замедлением в моей игре;Я думаю, что некоторые из моих сенсорных ответчиков не выгружаются должным образом, и поэтому по мере запуска игры их становится все больше и меньше, а касания становятся менее отзывчивыми, потому что им приходится проходить через все большую и большую цепочку ответчиков.
Есть ли какой-нибудь способ просмотреть / извлечь путь, пройденный UITouch по мере его перемещения по цепочке?Или просто какой-то способ получить список всех активных респондентов?
Спасибо, -С
Решение
Вы можете перехватить нужные методы на 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()
это прекрасная вещь.Конечно, будьте с этим осторожны;он отлично подходит для отладки, но очень сбивает с толку, если используется без разбора.
Другие советы
Я бы изучил использование вашей памяти, вместо того чтобы пытаться извлечь все ответчики.Либо загляните в инструменты http://www.mobileorchard.com/find-iphone-memory-leaks-a-leaks-tool-tutorial/
или, наоборот, просто добавьте несколько NSLog(@"responded");
войдите в свои методы touchesBegan и посмотрите, регистрируется ли это примерно десять раз для каждого касания.