无法识别的选择器发送到实例 - 在setter方法上

时间:2009-11-10 04:13:00

标签: iphone objective-c cocoa

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

我不确定它是否与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
)

2 个答案:

答案 0 :(得分:7)

  

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] ]

答案 1 :(得分:0)

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

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

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

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