我做了以下代码,以检查是否超级实现了该方法(使用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)]
。
尽管我不确定为什么要这么做,因为动态超类实际上并不受语言支持。