【问题标题】:Unrecognized selector sent to instance - on setter method无法识别的选择器发送到实例 - 在 setter 方法上
【发布时间】:2009-11-10 04:12:59
【问题描述】:

每次尝试在我的模型对象中设置任何变量的值时,我都会收到“无法识别的选择器发送到实例”错误,并且应用程序崩溃。 ivars 已被合成,它们不是只读的。我检查了设置的值是正确的类型。

我不确定它是否与 IB 中的某些连接有关,我已经检查了重新检查。

补充一点信息:我开始使用早期版本的 Xcode 进行开发,并且在该版本上使用的同一段代码。

这是确切的错误消息:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSCFString setDistance:]: unrecognized selector sent to instance 0x380ce50'
2009-11-10 15:10:58.113 CabMeter[7432:207] Stack: (
    29303899,
    2457931593,
    29685819,
    29255286,
    29107906,
    11415,
    3140002,
    3149770,
    3199319,
    3236748,
    3170686,
    3230561,
    3179329,
    12452,
    3918761,
    3933474,
    4979284,
    4987529,
    3990121,
    2838067,
    2746396,
    2773173,
    37400273,
    29088640,
    29084744,
    37394317,
    37394514,
    2777091,
    9208,
    9062
)

【问题讨论】:

  • 就像下面 Peter Hosey 的回答所示,您将消息发送到字符串,而不是您的对象实例。您可以发布生成此错误的代码吗?这样(如果你还没有找到)有人可以检查你的代码,看看哪里出了问题。

标签: iphone objective-c cocoa


【解决方案1】:

这些 ivars 已被合成,它们不是只读的。

我认为您将实例变量与属性混淆了。属性是您通常合成和/或设为只读的,它们通常但不一定由实例变量支持。

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSCFString setDistance:]: unrecognized selector sent to instance 0x380ce50'

这就是您应该阅读错误消息的原因。

将您的setDistance: 消息发送到您的模型对象——您将它发送到一个字符串。很可能,您没有像应有的那样保留模型对象,并且此后不久就分配了一个具有相同地址的字符串。

查看the memory management rules 并寻找您没有关注他们的地方。如果您的所有属性都设置正确,请确保您确实在使用它们:一个常见的错误是直接分配给 ivar:

myModel = [[[MyModel alloc] init] autorelease]

而不是通过属性:

self.myModel = [[[MyModel alloc] init] autorelease]

[self setMyModel:[[[MyModel alloc] init] autorelease]]

【讨论】:

  • 看准了!我没有保留模型,内存位置在不同时间被字符串、字典或其他东西占用!非常感谢..
【解决方案2】:

“发送到实例的无法识别的选择器”听起来像您有一个委托,它为不存在的方法定义了一个选择器。

您的代码中是否有@selector(methodName)

在堆栈跟踪中,在抛出异常之前调用的最后一段代码是什么?

如果是在 setter 方法上,我们能看看你是如何声明实例变量以及如何合成它的吗?

【讨论】:

    猜你喜欢
    • 2019-08-28
    • 2012-07-24
    相关资源
    最近更新 更多