我做了以下代码,以检查是否超级实现了该方法(使用responsToSelector)

- (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 :)

最佳答案

[super respondsToSelector: @selector(someSelector)]不会测试超类是否实现someSelector。它测试当前对象(即self)是否响应someSelector,但是它使用超类的respondsToSelector:实现来实现。换句话说,除非您已覆盖respondsToSelector:,否则代码[super respondsToSelector: @selector(someSelector)][self respondsToSelector: @selector(someSelector)]完全相同,因为您已经在使用继承的版本。

您想要的是[[[self class] superclass] instancesRespondToSelector: @selector(someSelector)]

尽管我不确定为什么要这么做,因为动态超类实际上并不受语言支持。

10-08 07:27