Xcode 中“无法识别的选择器发送到实例”是什么意思

问题描述 投票:0回答:11

"unrecognized selector sent to instance"
中的
Xcode
是什么意思?

xcode
11个回答
18
投票

这意味着方法未定义,或者相反,在错误的对象上调用方法。

此错误的经典示例是选择器调用中缺少“:”。

UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self
                action:@selector(DatePickerDoneClick)];

这里,

action:@selector(DatePickerDoneClick:)

是预期的而不是

action:@selector(DatePickerDoneClick)

13
投票

如果您在情节提要上删除并重新创建了按钮,则该按钮可能会链接到两种不同的方法:旧的(已删除的)方法和新的方法。这种事在我身上发生过很多次。

修复: 1) 在 XCode/IB 中,查看 Storyboard。 2) 单击导致异常的按钮。 3) 在最右侧面板上,单击“连接器”图标。 (一个带有箭头的圆圈,截至 2015 年 4 月)。 4) 假设您要链接到“Touch Up Inside”操作,请确保仅链接一种方法。每个旁边都会出现一个 [x],所以如果有两个,请杀死不再存在的那个。


6
投票

就我而言,这意味着我(两天)不理解处理程序(选择器、函数)的一个非常简单的要求: 我在我的选择器(函数)中遗漏了 ...:(NSNotification*)notification...。

最终这只是一个 self.stupidMistake(或者在尝试理解 iOs/xCode 中的新事物时编程疲倦)。我阅读了苹果的文档,我在 stackoverflow 上阅读了很多很多,并从搜索结果中阅读了各种其他页面,但一直忽略了我所拥有的事实: 在viewDidLoad中:

[[NSNotificationCenter defaultCenter] addOberserver:self selector:@selector(myHandler:) name:@"UIApplicationWillResignActiveNotification" object:nil];

在我发明的.h(声明)和.m(真实代码)中:

-(void)myHandler { ... }

这会在运行时生成发送到实例的无法识别的选择器(崩溃和调试输出)(xcode 中没有错误或警告)。然后我花了几乎整整两天的时间试图找出错误,错误是:

-(void)myHandler:(NSNotification*)notification { ... }

希望它能帮助其他陷入困境的人 - 这是一个语法问题(你的选择器或处理程序或函数或任何你想称呼它的东西)必须将(NSNotification *)“对象”作为参数,无论你是否使用它;并且 xcode(4.2 w/iOs SDK 5.0)不会生成有关此“错误”的任何错误或警告。


5
投票

我认为这个错误是由于调用类中未在类中声明的函数造成的。


5
投票

这意味着您在不支持该方法的对象上调用了该方法。

之所以说“无法识别的选择器”是因为方法调用是通过消息发送机制实现的。消息中包含方法名称的部分称为选择器。


2
投票

我认为是当您在不属于该实例的方法实例上调用选择器时。 也许我错了,我不确定,自从我在 xcode 中编写任何代码以来已经有一段时间了。


1
投票

对我来说只是

Xcode
不去编译代码。 Apple 显然认为 iOS 开发不够复杂,因此他们必须在 IDE 中构建额外的脆弱性。

我听说

SHIFT+COMMAND+K
清理构建会有很大帮助。


0
投票

由于没有将自定义类分配给界面生成器中的视图,我收到了此错误。

 NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"EventsFilterView" owner:self options:nil];
 self.filters = [subviewArray objectAtIndex:0];

变量

self.filters
已分配给
EventFilterView
类,但 xib 文件中的实际视图并未分配。

希望这对某人有帮助。


0
投票

发生这种情况的原因有多种:

ONE:该方法在.h中声明,但在.m中不存在。编译器不会抱怨,但在执行过程中你会遇到崩溃。请检查一下:

  1. 该方法在m中实现。
  2. 方法签名完全一样。
  3. 方法签名末尾没有分号。

二:如果调用委托方法,请检查该方法是否真正实现。

我以前修改签名的时候也出现过这个错误,但是我忘记更新实现文件.m上的签名方法了


0
投票

我遇到了类似的问题,问题是包含未知选择器的“.m”类不在“构建阶段/编译源”列表中。 我添加了它,一切都修复了。


0
投票

迟到的答案,但我在这个问题上被困了好几天,对我来说,正如哈维尔提到的,我的签名略有不同,因为我在故事板中使用的视图控制器中添加了抛出到我的@IBAction函数。

© www.soinside.com 2019 - 2024. All rights reserved.