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 回答