respondsToSelector用于超类调用

时间:2015-07-03 08:10:31

标签: ios objective-c polymorphism objective-c-runtime

我有以下方法:

- (void) someMethod
{
    if ([super respondsToSelector:@selector(someMethod)])
    {
        [super performSelector:@selector(someMethod)
                    withObject:nil];
    }
}

someMethod 不存在超类。据我所知,如果没有这样的方法,运行时会向链中的下一个响应者询问这种方法,直到NSObject类。我确信,如果声明将返回NO。

声明返回YES。之后它执行选择器而不会崩溃。结果 - 无限递归。

所以,我有两个问题:

  1. 为什么[super respondsToSelector:@selector(someMethod)]会返回YES?
  2. 为什么[super performSelector:@selector(someMethod) withObject:nil]不会因错误而崩溃'没有响应选择器'?
  3. 我想我错过了必不可少的东西。 请帮忙。

1 个答案:

答案 0 :(得分:4)

是的,你错过了一些必要的东西,如你所说。来自respondsToSelector:

的文档
  

通过使用respondsToSelector:关键字将super发送到对象,您无法测试对象是否从其超类继承方法。这个方法仍然会测试整个对象,而不仅仅是超类的实现。因此,将respondsToSelector:发送到super相当于将其发送到self。相反,您必须直接在对象的超类上调用NSObject类方法instancesRespondToSelector:,如下面的代码片段所示。

if( [MySuperclass instancesRespondToSelector:@selector(aMethod)] )
{
   // invoke the inherited method
   [super aMethod];
}

HTH