【问题标题】:respondsToSelector can not recognise the implemented selectorrespondsToSelector 无法识别实现的选择器
【发布时间】:2016-03-22 07:02:21
【问题描述】:

在 UIViewController 的一个简单子类中,我刚刚实现了一个选择器作为刷新 UI 的回调

-(void)afterfollowAction:(id)object{
  //blabla
}

但最后我发现respondsToSelector 无法识别。测试代码:

SEL callback = @selector(afterFollowAction:);
BOOL test1 = [self respondsToSelector:callback]; //NO
BOOL test2 = [self respondsToSelector:@selector(afterFollowAction:)]; //NO
BOOL test3 = [[self class] instanceMethodForSelector: @selector(afterFollowAction:)];  //YES
BOOL test4 = [self respondsToSelector:@selector(viewWillDisappear:)]; //YES
[self performSelector:callback withObject:nil]; //crash

test2 显示不是局部变量回调的问题,

test4 表明它知道它是一个 UIViewController 并且 self 不是 nil

test3 实际上表明它知道选择器已实现

但是如果你用“performSelector”调用它,它会抛出异常“无法识别的选择器”

我在网上搜索了“:”或nil的东西没有出错;

我把选择器的声明放到了头文件中,但是没有用。

我重新启动了 Mac 和 iPhone,但结果相同。

这是一个简单的类,我没有在其中重新实现 respondsToSelector: 选择器。

那么,我是否错误地使用了 respondsToSelector?我只想在这个类之外进行回调。

环境:Mac OS X 10.11.3、Xcode 7.2.1、iOS 9.2.1

更新: find(cmd+F) without match case 隐藏 f/F 问题。感谢基兰!

【问题讨论】:

  • 您是否也将函数声明添加到 .h 文件中?

标签: ios objective-c


【解决方案1】:

应该是

SEL callback = @selector(afterfollowAction:);
BOOL test1 = [self respondsToSelector:callback]; //NO
BOOL test2 = [self respondsToSelector:@selector(afterfollowAction:)]; //NO
BOOL test3 = [[self class] instanceMethodForSelector: @selector(afterfollowAction:)];  //YES
BOOL test4 = [self respondsToSelector:@selector(viewWillDisappear:)]; //YES
[self performSelector:callback withObject:nil]; //crash

您使用的是大写“F”

【讨论】:

  • 非常感谢!还有我自己!当我写下这个问题时,我什至想强调我使用复制/粘贴和 cmd+F 来检查!最后是我的笨蛋!
  • 使用 cmd+f 区分大小写 :)
猜你喜欢
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 2018-01-22
  • 2019-08-28
相关资源
最近更新 更多