错误“无法识别的选择器发送到实例”在Xcode中意味着什么

时间:2011-03-28 06:19:17

标签: xcode

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

10 个答案:

答案 0 :(得分:17)

这意味着,方法没有定义,或者在另一方面,在错误的对象上调用方法。

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

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

下面,

action:@selector(DatePickerDoneClick:)
预计

而不是

action:@selector(DatePickerDoneClick)

答案 1 :(得分:6)

在我的情况下,这意味着我不理解(两天)处理程序(选择器,函数)的一个非常简单的要求: 我在我的选择器(功能)中放弃了...... :( NSNotification *)通知 ....

最后它只是一个self.stupidMistake(或者在尝试理解iOs / xCode中的新东西时编程很累)。我在apple阅读了文档,我在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)不会产生任何有关此“错误”的错误或警告。

答案 2 :(得分:6)

如果您在故事板上删除并重新创建了按钮,则可以将按钮链接到两种不同的方法:旧(已删除)和新(新)。这种情况多次发生在我身上。

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

答案 3 :(得分:5)

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

它说'无法识别的选择器'的原因是方法调用是由消息发送机制实现的。包含方法名称的消息部分称为选择器。

答案 4 :(得分:4)

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

答案 5 :(得分:2)

我认为当你在不属于这个实例的方法实例上调用选择器时。 也许我错了我不确定,因为我在xcode中编码任何东西已经有一段时间了。

答案 6 :(得分:1)

对我而言,只是Xcode无需编译代码。 Apple显然认为iOS开发不够复杂,因此他们必须在IDE中构建额外的瑕疵。

我被告知SHIFT+COMMAND+K清理构建可能是一个很大的帮助。

答案 7 :(得分:0)

由于没有将自定义类分配给Interface Builder中的视图,我收到了此错误。

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

变量self.filters已分配给EventFilterView类,但xib文件中的实际视图不是。

希望这有助于某人。

答案 8 :(得分:0)

出现这种情况的原因有以下几种:

ONE:该方法在.h中声明,但在.m中不存在。编译器没有抱怨,但在执行期间你面临崩溃。请检查出来:

  1. 该方法在m。
  2. 中实施
  3. 方法签名完全相同。
  4. 方法签名末尾没有分号。
  5. TWO:如果您正在调用委托方法,请检查此方法是否真正实现。

    我在修改签名时使用此错误,但我忘记更新实现文件上的签名方法.m

答案 9 :(得分:0)

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