gpt4 book ai didi

ios - 用于 super 类调用的responsToSelector

转载 作者:行者123 更新时间:2023-12-01 18:11:07 25 4
gpt4 key购买 nike

我有以下方法:

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

someMethod 在 super class 上不存在。据我了解,如果没有这样的方法,运行时将向链中的下一个响应者询问这种方法,直到NSObject类为止。而且我确信,if语句将返回否。

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

所以,我有两个问题:
  • 为什么[super respondsToSelector:@selector(someMethod)]返回YES?
  • 为什么[super performSelector:@selector(someMethod) withObject:nil]不会因错误“不响应选择器”而崩溃?

  • 我想我错过了一些必不可少的东西。
    请帮忙。

    最佳答案

    是的,您错过了您所建议的重要内容。从respondsToSelector:的文档中

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

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

    高温超导

    关于ios - 用于 super 类调用的responsToSelector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31201801/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com