我目前正在尝试通过填写必需的属性来设置我的实体。我这样做是通过解析XML响应并在它们出现时分配属性来实现的。我遇到的问题是我有一个类型不匹配导致我的属性集函数抛出“错误的选择器发送到函数”错误。我已经进入调试器并注意到在分配给我的custEntity.name属性之前,我的类型似乎是NSCFString而不是NSString。我已经做了一些搜索,以及我自己的一些测试和尝试修复,但一直无法到达任何地方。以下是一些相关代码及其效果。
使用我的其他实体定义DataModelObject.h自动生成并合并到一个文件中:
@interface Checkpoint : NSManagedObject {
@private
}
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * lat;
@property (nonatomic, retain) NSNumber * lon;
@property (nonatomic, retain) NSManagedObject * myRoute;
@end
DataModelObject.m
@implementation Checkpoint
@dynamic name;
@dynamic lat;
@dynamic lon;
@dynamic myRoute;
@end
我当前的代码看起来是因为向其他地方提出了类似问题的其他人的建议:
NSString *chkptName = [attributeDict objectForKey:@"name"];
checkpoint.name = [[NSString stringWithString:chkptName] stringValue];
这对我来说似乎有点严重,但我不熟悉Objective-c和iPhone开发,所以我不知道,它可能是必要的,无论如何这都行不通。在执行第二行之前,chkptName的值是我想要分配的正确的,人类可读的字符串。理论上,如果我正确理解第二行,我只需重新声明一个值为ckptName的NSString,并使用stringValue再次读出它的实际值,这应该与获取chkptName的值相同。然而,它在我的应用程序与sigAbrt崩溃的第二行中,当我尝试检查我的变量的值时,它显示其类型为NSCFString,其值为无效摘要。在这一点上,我对如何解决这个问题感到茫然。我之前已经正确修改过实体属性,之前没有遇到过这个问题。
也许值得注意的是,我开始这么简单:
checkpoint.name = [attributeDict objectForKey:@"name"];
但是这产生了相同的sigAbrt和错误的选择器错误。
编辑:请求完全错误:
2011-08-02 07:25:53.544 MyApp [16011:207] - [NSCFString stringValue]:无法识别的选择器发送到实例0x5c174e0 2011-08-02 07:25:00.545 MyApp [16011:207] * 由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [NSCFString stringValue]:无法识别的选择器发送到实例0x5c174e0'
Edit2:调试器输出:
(gdb) po checkpoint
<Checkpoint: 0x5a30730> (entity: (null); id: (null) ; data: {})
(gdb) po [checkpoint class]
Checkpoint
(gdb) po [checkpoint entity]
Can't print the description of a NIL object.
非常感谢您提供的任何澄清,如果还有一些我错过的相关代码,请询问,如果可能,我将很乐意提供。谢谢!
-Karoly
答案 0 :(得分:1)
我认为您应该仔细查看并确认您的checkpoint
变量确实是Checkpoint
类的实例。
po checkpoint
。po [checkpoint entity]
。答案 1 :(得分:1)
所以似乎这个问题已经得到了回答,但也许可以在将来参考:
如果您收到如下错误:
2011-08-02 07:25:00.544 MyApp[16011:207] -[NSCFString stringValue]: unrecognized selector sent to instance
真正看看它的含义是非常有用的:
unrecognized selector sent to instance
表示某个对象收到的消息是无法响应或不知道如何操作。
-[NSCFString stringValue]
会向您显示已发送的消息(stringValue
)以及发送给哪些对象(NSCFString
)。
从错误中的消息我们看到,当您调用
时,最有可能发生错误checkpoint.name = [[NSString stringWithString:chkptName] stringValue];
因为这似乎是您在对象上调用消息stringValue
的唯一地方(来自您发布的内容)。 NSCFString
只是NSString
的一个子类。
因此,您无法在stringValue
上致电NSString
(这也是有道理的)。只是为了澄清,但正如我所读,问题已经解决。 :)