我做了以下代码,检查,是否超级实现方法(使用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:)
答案 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)]
。
虽然我不确定你为什么这样做,因为语言并不真正支持动态超类。