2009-12-18 95 views
3

我試圖在我的遊戲中調試一些touchesBegan/Moved/Ended相關的放緩;我認爲我的一些接觸響應者沒有正確地卸載,所以隨着越來越多的遊戲運行在遊戲中,接觸的反應越來越少,因爲他們必須通過更大和更大的響應者鏈。有沒有辦法檢索處理UITouch的每個響應者?

是否有某種方式可以查看/檢索UITouch通過鏈時所採用的路徑?或者簡單地以某種方式檢索所有活動響應者列表?

感謝, -S

回答

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()是一件美麗的事情。當然要小心;這對調試非常有用,但如果不加區分地使用,會非常混亂。

+0

'NSNotificationCenter'→'self'? – zoul 2010-04-06 17:26:54

+0

@zoul。對不起,這段代碼來自於NSNotificationCenter的劫持。接得好。固定。 – 2010-04-07 14:55:44

+0

這似乎並沒有爲iOS 3.2編譯。聲稱_Method_不存在(以及您使用的其他反射函數)。任何想法爲什麼? – 2010-10-22 18:03:12

相關問題