添加NSManagedObject子类,重复链接时出现重复的符号错误

KFZ*_*KFZ 34 xcode nsmanagedobject ios objective-c-category

我试图在Xcode中自动创建NSManagedObject子类(2个相关实体).它们是这样生成的:

在此输入图像描述

但是,在我做任何进一步操作之前,当我尝试构建并运行它时,会发生链接错误,如下所示:

duplicate symbol _OBJC_CLASS_$_Photo in: /Users/Kefeng/Library/Developer/Xcode/DerivedData/Photomania-aellrakjngugnzcgrleiytvrfvyt/Build/Intermediates/Photomania.build/Debug-iphonesimulator/Photomania.build/Objects-normal/x86_64/Photo+CoreDataClass.o duplicate symbol _OBJC_METACLASS_$_Photo in: /Users/Kefeng/Library/Developer/Xcode/DerivedData/Photomania-aellrakjngugnzcgrleiytvrfvyt/Build/Intermediates/Photomania.build/Debug-iphonesimulator/Photomania.build/Objects-normal/x86_64/Photo+CoreDataClass.o duplicate symbol _OBJC_CLASS_$_Photography in: /Users/Kefeng/Library/Developer/Xcode/DerivedData/Photomania-aellrakjngugnzcgrleiytvrfvyt/Build/Intermediates/Photomania.build/Debug-iphonesimulator/Photomania.build/Objects-normal/x86_64/Photography+CoreDataClass.o duplicate symbol _OBJC_METACLASS_$_Photography in: /Users/Kefeng/Library/Developer/Xcode/DerivedData/Photomania-aellrakjngugnzcgrleiytvrfvyt/Build/Intermediates/Photomania.build/Debug-iphonesimulator/Photomania.build/Objects-normal/x86_64/Photography+CoreDataClass.o ld: 4 duplicate symbols for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

我曾多次尝试创建新项目并做同样的事情.我的初衷是将一些自定义方法添加到子类中.但是当我添加任何东西时,例如Photo+CoreData.h/m,出现与上面相同的错误.

我找到了一些关于"双重包含"或"将文件保存到错误的目录"的答案,但我没有这样做.有人对此有任何想法吗?

小智 51

如果您不自动生成托管对象子类,那么不要忘记在数据模型检查器中检查实体的"Codegen"设置:

在此输入图像描述

  • 这是正确的答案,应该被接受。文件生成后就被丢弃的答案对我来说毫无意义。 (2认同)

Mik*_*ley 42

编辑:感谢@iPeter的一些帮助,找到了以下内容:

在执行编辑>生成NSManagedObject文件后,如果在构建之前删除文件,则项目应该不会产生任何问题.

删除这些文件

然后#import"myManagedObjectName + CoreDataClass.h"(其中MO名称是核心数据中实体检查器中的名称)到您需要这些托管对象的任何类中.

换句话说,您不需要文件夹中的任何实际ManagedObject文件.Xcode将生成的文件保存在Derived Data文件夹中.

如果由于某种原因您需要将这些文件保留在文件目录中,则以下解决方法将起作用.转到Target并删除Compile Sources中的CoreDataClass源.

之前

离开你这个:

后

  • 我在初始生成ManagedObject子类之后添加的大多数新属性/关系在构建之后都可用作属性.在我重命名现有关系的一种情况下,我不得不再次执行编辑器>生成NSManagedObject子类,然后在我的文件夹中删除新文件,构建,一切正常.

刚刚写了一篇博客文章,其中包含了所有感兴趣的人的信息.


Ear*_*rey 31

您应删除所有这些实体,在Data Model Inspector中将"Codegen"设置更改为"Manual/None",然后再次生成实体.它很好用!您不需要从Compile Source中删除+ CoreDataClass.h文件.您不需要将实体标记为抽象.您不需要自己生成类.您应该只更改"Codegen"设置并自动重新生成实体. 在此输入图像描述


Fro*_*Cap 0

您需要删除自己生成的CoreData相关子类,并且可以保留这些类的#import行,现在所有这些文件将在构建项目时自动生成。