对respondsToSelector的超类检查失败

时间:2013-09-21 17:39:38

标签: ios cocoa

我做了以下代码,检查,是否超级实现方法(使用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:)

1 个答案:

答案 0 :(得分:3)

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

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

虽然我不确定你为什么这样做,因为语言并不真正支持动态超类。