我正在尝试在我的游戏中调试一些touchesBegan / Moved / Ended相关减速;我认为我的一些触摸响应器没有正确卸载,因此当游戏运行时,越来越多的它们堆叠起来并且触摸响应性降低,因为它们必须通过越来越大的响应链。
有没有办法查看/检索UITouch在链中移动时所采用的路径?或者只是某种方式来检索所有活动响应者的列表?
谢谢, -S
答案 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");
,然后查看每次触摸是否记录十次。