Есть ли способ получить каждого ответчика, который обработал UITouch?

StackOverflow https://stackoverflow.com/questions/1929740

Вопрос

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

Есть ли какой-нибудь способ просмотреть / извлечь путь, пройденный 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 и посмотрите, регистрируется ли это примерно десять раз для каждого касания.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top