Iphone 核心数据:设置实体、属性、类型问题

Iphone 核心数据:设置实体、属性、类型问题,iphone,objective-c,ipad,ios4,core-data,Iphone,Objective C,Ipad,Ios4,Core Data,我目前正试图通过填写所需的属性来设置实体。我通过解析XML响应并在属性出现时分配属性来实现这一点。我遇到的问题是,我的类型不匹配,导致属性集函数抛出“发送到函数的选择器不正确”错误。我进入了调试器,注意到总是在分配给custEntity.name属性之前,我的类型似乎是NSCFString而不是NSString。我已经做了一些搜索,也做了一些测试,尝试了自己的修复,但一直都没有找到任何地方。下面是一些相关的代码及其效果 自动生成并与另一个实体定义DataModelObject合并到一个文件中。h

我目前正试图通过填写所需的属性来设置实体。我通过解析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:00.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.
(gdb)采购订单检查点
(实体:(null);id:(null);数据:{})
(gdb)po[检查点等级]
检查站
(gdb)po[检查点实体]
无法打印NIL对象的描述。
非常感谢您提供的任何澄清,如果还有一些我遗漏的相关代码,请询问,如果可能,我将很乐意提供。谢谢


-Karoly

我认为您应该仔细查看并验证
checkpoint
变量是否确实是
checkpoint
类的实例

  • 验证是否在核心数据模型中正确设置了该类
  • 在运行时设置断点并在调试器中打印对象:
    po checkpoint
  • 在运行时使用以下命令验证对象的实体:
    po[checkpoint entity]

  • 因此,这个问题似乎已经得到了回答,但也许可以作为将来的参考:

    如果出现如下错误:

    2011-08-02 07:25:00.544 MyApp[16011:207]-[NSCFString stringValue]:发送到实例的选择器无法识别

    真正了解它所说的是非常有用的:

    发送到实例的无法识别的选择器
    表示对象收到了无法响应或不知道如何响应的消息

    -[NSCFString stringValue]
    显示发送的消息(
    stringValue
    )以及发送到的对象(
    NSCFString

    从错误中的消息中,我们可以看到错误很可能发生在您调用时

    checkpoint.name = [[NSString stringWithString:chkptName] stringValue];
    
    因为这似乎是在对象上调用消息
    stringValue
    的唯一位置(根据您发布的内容)。而
    NSCFString
    只是
    NSString
    的一个子类


    因此,您不能在
    NSString
    上调用
    stringValue
    (这也有道理)。我只是想澄清一下,但正如我所读到的,这个问题已经解决了

    您还可以使用“po[checkpoint class]”来查看它是什么类型的类。我继续并编辑了带有打印结果的问题。似乎[checkpoint entity]是nil,这可能是问题所在,尽管我无法对其进行任何设置以更改任何值,所以我不知道。我确实预先分配了检查点变量两行。@Karol S-这表明
    检查点
    实例没有用实体描述正确实例化。您是否使用
    +[NSEntityDescription entityForName:inManagedObjectContext:
    实例化新的托管对象,例如
    检查点
    类?Wooooow。。。我真不敢相信我没有更早地研究这个问题,特别是因为我在几次调用之前正确地实例化了一个托管对象。这就是问题所在,我现在是否正确地使用checkpoint.name=[attributeDict objectForKey:@“name]”赋值;并可以在调试器控制台中验证。现在来解决剩下的问题,哈哈。谢谢PeyloW和PaddCell的帮助@卡罗利:是的,任务应该可以。没问题,这就是我们在这里的原因:帮助和获得帮助:)。很抱歉耽搁了您。我已在问题底部附近发布了完整的错误。@Karoly S我已编辑了我的回复,并添加了一些有用的信息,如果您碰巧遇到类似于此的其他错误。希望这对你将来有所帮助:)很高兴你能解决这个问题!