3

ゲーム内の touchesBegan/Moved/Ended 関連のスローダウンをデバッグしようとしています。タッチ レスポンダーの一部が適切にアンロードされていないと思います。そのため、ゲームが実行されるにつれて、より多くのタッチ レスポンダーがスタックし、ますます大きなレスポンダー チェーンを通過する必要があるため、タッチの応答が遅くなります。

UITouch がチェーンを移動するときにたどるパスを表示/取得する方法はありますか? または、すべてのアクティブなレスポンダーのリストを取得する方法はありますか?

ありがとう、-S

4

2 に答える 2

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()美しいものです。もちろん注意してください。デバッグには最適ですが、無差別に使用すると非常に混乱します。

于 2009-12-18T20:24:27.197 に答える
1

すべてのレスポンダーを取得しようとするのではなく、メモリ使用量を調べます。楽器http://www.mobileorchard.com/find-iphone-memory-leaks-a-leaks-tool-tutorial/を調べる か、逆に、NSLog(@"responded");touchesBegan メソッドにいくつか入れて、10 のようにログに記録されるかどうかを確認します。各タッチの回数。

于 2009-12-18T17:57:21.393 に答える