从“NSEntityDescription *”分配给“NSManagedObject Subclass*”的不兼容指针类型

Posted

技术标签:

【中文标题】从“NSEntityDescription *”分配给“NSManagedObject Subclass*”的不兼容指针类型【英文标题】:Incompatible pointer types assigning to 'NSManagedObject Subclass*' from 'NSEntityDescription *' 【发布时间】:2013-12-16 17:15:09 【问题描述】:

我正在保存托管对象上下文,并使用以下方法来执行此操作:

trainingDayObject = [NSEntityDescription entityForName:@"trainingDay" inManagedObjectContext:self.context];

它有效,一切似乎都很好,但我收到了警告:

Incompatible pointer types assigning to 'VitTrainingDay *' from 'NSEntityDescription *'

VitTrainingDay 是核心数据实体 TrainingDay 的 NSManagedObject 子类。 trainingDayObjectVitTrainingDay 的一个实例

我已尝试阅读 NSEntityDescription 上的文档,但由于我分配给实体,我对问题所在感到困惑。

我对核心数据和 Objective-C 还很陌生,如果这真的很明显,请原谅我。这几天一直困扰着我。

【问题讨论】:

【参考方案1】:

当你这样做时:

[NSEntityDescription entityForName:@"trainingDay" inManagedObjectContext:self.context];

你得到的是NSEntityDescription 的一个实例。这是一个等效于您在 Xcode 的 Core Data 模型编辑器中配置的实体类型的对象。它代表一个实体type,而不是那个实体的一个实例。

从错误消息看来,trainingDayObject 被声明为 VitTrainingDay *,它是一个指向托管对象实例的指针。

这里的区别与类和类的实例之间的区别完全相同。这就像您试图将 NSString 类分配给应该是字符串的特定实例的东西。

你真正想要的是类似的东西

trainingDayObject = [NSEntityDescription insertNewObjectForEntityForName:@"trainingDay" inManagedObjectContext:self.context];

因为这个方法创建了一个实体类型的新实例,而不是仅仅给你实体类型对象本身。

【讨论】:

如果我使用insertNewObjectForEntityForName,除了从其他创建的对象中保存 MOC 之外,我最终还会创建空白对象。例如,在我的表格视图中,我得到 nil,nil,Name 1,Name 2,而不是预期的 Name1,Name 2。 然后再问一个问题,提供更多关于你在做什么的细节。例如,当您使用上述问题中的代码行时,您正在尝试做什么。只有一行,不可能给出一个反映应用程序整体结构上下文的答案。我所做的可能是解释那一行有什么问题。 我认为这是一个更简单的问题,并且不想让问题过于复杂。这是我的另一个问题:***.com/questions/20589938/…

以上是关于从“NSEntityDescription *”分配给“NSManagedObject Subclass*”的不兼容指针类型的主要内容,如果未能解决你的问题,请参考以下文章

OCMock - 试图模拟 NSEntityDescription

NSEntityDescription.entity 崩溃应用程序(SIGABRT)

NSEntityDescription 创建方法的区别

获取 NSEntityDescription 关系

NSEntityDescription.insertNewObject 函数导致 Swift 3 崩溃

必须有一个有效的 NSEntityDescription (SwiftUI)