0

メソッドをスーパー実装するかどうかを確認するために、次のコードを実行しました(respondsToSelectorを使用)

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    if ([super respondsToSelector:@selector(scrollViewWillBeginDragging:)]) {
        [super scrollViewWillBeginDragging:scrollView];
    }

    self.scrolling = YES;
}

しかし、それはYESと評価され、認識されないセレクターで壊れます

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[InputFormViewController scrollViewWillBeginDragging:]: unrecognized selector sent to instance 0x17da8670'

これは望ましい(誤った)動作ですか、それとも私はうまくやっていますか?違う?

注:スーパークラスは

@interface FormBaseViewController : UIViewController<UITableViewDataSource, UITableViewDelegate> 

実装していない (scrollViewWillBeginDragging:)

4

1 に答える 1

3

[super respondsToSelector: @selector(someSelector)]スーパークラスが を実装しているかどうかはテストしませんsomeSelector現在のオブジェクト(つまりself) が に応答するかどうかをテストしますsomeSelectorが、スーパークラスの の実装を使用して実行しrespondsToSelector:ます。つまり、オーバーライドしていない限り、継承されたバージョンを既に使用しているためrespondsToSelector:、コード[super respondsToSelector: @selector(someSelector)]は とまったく同じです。[self respondsToSelector: @selector(someSelector)]

あなたが欲しいのはです[[[self class] superclass] instancesRespondToSelector: @selector(someSelector)]

動的スーパークラスは言語で実際にサポートされていないため、なぜこれを行うのかわかりません。

于 2013-09-21T17:57:31.580 に答える