【问题标题】:NSManagedObject setter giving me [ MyObject setName:]: unrecognized selector sent to instanceNSManagedObject setter 给我 [MyObject setName:]: unrecognized selector sent to instance
【发布时间】:2014-07-13 04:26:25
【问题描述】:

我通过 xcode 编辑器菜单创建了一个 NSManagedObject。我的对象只有一个属性“名称”。当我尝试设置属性时,我得到“[MyObject setName:]: unrecognized selector sent to instance”

MyObject *thing = [MyObject objectFromJSONDictionary:obj];
thing.name = obj; <-- ERROR HERE

我检查了我在 CD 中的属性“名称”与我的班级中的相同。我的接口属性也是一样的。而我的动态属性也是一样的。

@property (nonatomic, retain) NSString * name;

@dynamic name;

有什么建议吗?是的,我已经清除了 CD 对象,清理了我的项目,并再次在 CD 中创建了它。同样的问题?

【问题讨论】:

  • 删除那个@dynamic name;
  • @MidhunMP:不,核心数据访问器方法是在运行时动态创建的,因此声明为@dynamic
  • objectFromJSONDictionary 是做什么的?最可能的原因是它没有正确初始化 Core Data 对象。
  • @martinR 你是对的。不知道为什么我不能只创建 [MyObject new] 然后稍后将其保存到 CD。
  • 根据documentationNSManagedObject必须初始化为initWithEntity:insertIntoManagedObjectContext:

标签: ios objective-c core-data


【解决方案1】:

来自NSManagedObject 类参考:

如果你直接实例化一个托管对象,你必须调用 指定初始化器 (initWithEntity:insertIntoManagedObjectContext:)。

还有一个方便的方法

+[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:]

可用于创建托管对象。

Core Data 对象的访问器方法是在运行时动态创建的, 所以这个限制的一个原因是实体描述必须是已知的。

您可以使用nil 上下文创建一个对象,然后将其添加到托管对象上下文中,例如:How can I associate an NSManagedObject to the context after it has been initialised?

【讨论】:

  • 请注意,如果您希望创建 NSManagedObject 并且不立即将其插入上下文中,则不能使用便捷方法。
猜你喜欢
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多