代码之家  ›  专栏  ›  技术社区  ›  Justin

如何在给定nsstring时确定obj-c中是否存在方法

  •  3
  • Justin  · 技术社区  · 14 年前

    我有一个方法 NSString * . 如果它存在,我想叫它,如果不存在,什么也不做。

    SEL eventSelector = NSSelectorFromString(eventSelectorStr);
    if ([delegate respondsToSelector:eventSelector]) {
        [delegate performSelector:eventSelector];
        [delegate adapterDidFinishAdRequest:self];
    }
    else {
        // Does not implement selector
    }
    

    此代码不起作用,因为 NSSelectorFromString 将字符串注册为选择器,因此 respondsToSelector:eventSelector 将导致崩溃,因为选择器实际上无效。

    4 回复  |  直到 10 年前
        1
  •  5
  •   Dave DeLong    14 年前

    你为什么说那不管用?这是实现调用可选委托方法的最常用方法。我从来没有对这个结构不起作用的问题。

        2
  •  1
  •   Paul Lynch    14 年前

    让我们澄清一些混乱。

    NSSelectorFromString() 将从字符串生成有效的选择器,并且不会崩溃。 respondsToSelector: 将有效地确定委托是否实现该方法,而不会崩溃。确实,如果使用委托未实现的选择器调用performselector:将导致崩溃。

    然而,情况并非如此。代码有效。如果您在这段代码中遇到崩溃,我将检查错误消息,并查看 adapterDidFinishAdRequest: .

        3
  •  0
  •   drawnonward    14 年前

    尝试检查 eventSelector != nil 在使用之前。

        4
  •  0
  •   Tim Knauf    14 年前

    我也花了一段时间才明白这一点。关键的见解是选择器引用是 基本上就是一根C弦 ,而且 不属于任何特定的类或对象 . 当 NSSelectorFromString() 文档中说选择器是“注册的”,它只是意味着一个经过修饰的c字符串被“祝福”(我的术语)用作objective-c运行时中的选择器。

    以下是 nsSelectorFromString() 来自苹果的文档:

    返回值

    由命名的选择器 非选定名称 . 如果 非选定名称 nil ,或不能 转换为UTF-8(这应该是 仅由于内存不足, 回报 (SEL)0 .

    仔细阅读它可以发现 只有 可能导致 (SEL)0 如果你的字符串是 或者如果你的记忆用完了。