有没有办法检索处理UITouch的每个响应者?

时间:2009-12-18 17:50:52

标签: iphone debugging uikit uitouch

我正在尝试在我的游戏中调试一些touchesBegan / Moved / Ended相关减速;我认为我的一些触摸响应器没有正确卸载,因此当游戏运行时,越来越多的它们堆叠起来并且触摸响应性降低,因为它们必须通过越来越大的响应链。

有没有办法查看/检索UITouch在链中移动时所采用的路径?或者只是某种方式来检索所有活动响应者的列表?

谢谢, -S

2 个答案:

答案 0 :(得分:5)

您可以在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 :(得分:1)

我会调查你的内存使用情况,而不是试图检索所有响应者。 查看工具http://www.mobileorchard.com/find-iphone-memory-leaks-a-leaks-tool-tutorial/ 或者相反,只需在你的touchesBegan方法中输入一些NSLog(@"responded");,然后查看每次触摸是否记录十次。