1

UIResponder の canPerformAction:withSender: メソッドと、このメソッドをオーバーライドしたすべてのサブクラスをスウィズルしようとしています。

これを行うには、元の実装をクラス名でキー付けされた辞書に格納します。元の実装を呼び出す前に、スウィズル バージョンの実装でディクショナリを検索します。

これは場合によってはうまくいくように見えますが、元の実装が super を呼び出すと失敗します。次に、スウィズルされたメソッドが継続的に呼び出され続け、プログラムは無限再帰に入ります。

ここで何が問題なのですか?

4

1 に答える 1

2

スウィズルの後、-originalwith -custom:

-(void)custom {
    [self custom]; // calls -original
}

-(void)original {
    [self original]; // calls -custom
}

スーパークラスでメソッドが入れ替わっている場合、objc_msgSendSuper は同じことを行うと述べました。


-(void)custom {
    [self original]; // calls -custom, makes recursion
}

 -(void)original {
    [self custom]; // calls -original, makes recursion
}
于 2012-07-16T12:23:13.583 に答える