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

时间:2016-11-07 07:57:12

标签: ios xcode nsmanagedobject objective-c-category

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

enter image description here

但是,在我做任何事情之前,当我尝试构建并运行它时,会发生链接错误,如图所示:

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,出现与上述相同的错误。

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

6 个答案:

答案 0 :(得分:49)

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

enter image description here

答案 1 :(得分:41)

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

做完编辑后>生成NSManagedObject文件,如果您在构建之前删除文件,您的项目应该没有问题。

Trash these files

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

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

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

Before

离开你:

After

  • 我在初始生成ManagedObject子类后添加的大多数新属性/关系在构建后都可用作属性。在我重命名现有关系的一个案例中,我不得不做编辑>再次生成NSManagedObject子类,然后我在我的文件夹中删除了新文件,构建了,一切正常。

刚为感兴趣的人写了a blog post that includes this info

答案 2 :(得分:30)

您应删除所有这些实体,在数据模型检查器中将“Codegen”设置更改为“手动/无”,然后再次生成实体。它很好用!您不需要从Compile Source中删除+ CoreDataClass.h文件。您不需要将实体标记为抽象。您不需要自己生成类。您应该只更改“Codegen”设置并自动重新生成实体。 enter image description here

答案 3 :(得分:0)

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

答案 4 :(得分:0)

后期...但对我来说只是一个实体的复制粘贴,Xcode似乎没有改变与该实体关联的原始类名(在Xcode 9.0.1上观察到)

答案 5 :(得分:-1)

我最近尝试了上述答案,但失败了。 不知何故,Xcode仍在生成文件。

我使用以下方法解决了这个问题:

  • 将所有实体标记为摘要
  • 构建
  • 删除抽象标志
  • 构建
  • 成功!

这听起来像是Xcode中的一个错误......