我有以下方法:
- (void) someMethod
{
if ([super respondsToSelector:@selector(someMethod)])
{
[super performSelector:@selector(someMethod)
withObject:nil];
}
}
someMethod 不存在超类。据我所知,如果没有这样的方法,运行时会向链中的下一个响应者询问这种方法,直到NSObject类。我确信,如果声明将返回NO。
声明返回YES。之后它执行选择器而不会崩溃。结果 - 无限递归。
所以,我有两个问题:
[super respondsToSelector:@selector(someMethod)]
会返回YES?[super performSelector:@selector(someMethod) withObject:nil]
不会因错误而崩溃'没有响应选择器'?我想我错过了必不可少的东西。 请帮忙。
答案 0 :(得分:4)
是的,你错过了一些必要的东西,如你所说。来自respondsToSelector:
通过使用
respondsToSelector:
关键字将super
发送到对象,您无法测试对象是否从其超类继承方法。这个方法仍然会测试整个对象,而不仅仅是超类的实现。因此,将respondsToSelector:
发送到super
相当于将其发送到self
。相反,您必须直接在对象的超类上调用NSObject
类方法instancesRespondToSelector:
,如下面的代码片段所示。
if( [MySuperclass instancesRespondToSelector:@selector(aMethod)] )
{
// invoke the inherited method
[super aMethod];
}
HTH