我試圖在我的遊戲中調試一些touchesBegan/Moved/Ended相關的放緩;我認爲我的一些接觸響應者沒有正確地卸載,所以隨着越來越多的遊戲運行在遊戲中,接觸的反應越來越少,因爲他們必須通過更大和更大的響應者鏈。有沒有辦法檢索處理UITouch的每個響應者?
是否有某種方式可以查看/檢索UITouch通過鏈時所採用的路徑?或者簡單地以某種方式檢索所有活動響應者列表?
感謝, -S
我試圖在我的遊戲中調試一些touchesBegan/Moved/Ended相關的放緩;我認爲我的一些接觸響應者沒有正確地卸載,所以隨着越來越多的遊戲運行在遊戲中,接觸的反應越來越少,因爲他們必須通過更大和更大的響應者鏈。有沒有辦法檢索處理UITouch的每個響應者?
是否有某種方式可以查看/檢索UITouch通過鏈時所採用的路徑?或者簡單地以某種方式檢索所有活動響應者列表?
感謝, -S
您可以在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方法中,並查看它是否每次觸摸都記錄十次。
'NSNotificationCenter'→'self'? – zoul 2010-04-06 17:26:54
@zoul。對不起,這段代碼來自於NSNotificationCenter的劫持。接得好。固定。 – 2010-04-07 14:55:44
這似乎並沒有爲iOS 3.2編譯。聲稱_Method_不存在(以及您使用的其他反射函數)。任何想法爲什麼? – 2010-10-22 18:03:12