创建 NSManagedObject 时,使用 Coredata 的项目中出现 Apple Mach-O 链接器错误 Class

Apple Mach-O Linker Error in project with Coredata, when creating NSManagedObject Class

我有一个包含核心数据、基于故事板和 3 个 classes 的项目。核心数据的目的是在 MapKit 上保存位置,但是当我创建 NSManagedObject 的 class "Spot"、subclass 时,我得到了这个构建时错误。它说:

duplicate symbol _OBJC_METACLASS_$_Spot in:
    /Users/vitorferreira/Library/Developer/Xcode/DerivedData/CoreDataCity-buwqjxltijduybepebqqghhkrqwe/Build/Intermediates/CoreDataCity.build/Debug-iphonesimulator/CoreDataCity.build/Objects-normal/i386/Spot.o
    /Users/vitorferreira/Library/Developer/Xcode/DerivedData/CoreDataCity-buwqjxltijduybepebqqghhkrqwe/Build/Intermediates/CoreDataCity.build/Debug-iphonesimulator/CoreDataCity.build/Objects-normal/i386/Spot+CoreDataClass.o
ld: 2 duplicate symbols for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

在之前的评论中(这是一个经过编辑的问题)-据说原因是库中的重复代码...但老实说我不明白...任何帮助都会非常感谢

这意味着您的库中某处有重复代码,您是否在多个位置导入了核心数据?

根据重复符号的名称,我猜这是一个 Objective C 项目并且您在 Spot.hSpot+CoreDataClass.h 中都有以下(或类似):

@interface Spot: NSManagedObject

_OBJC_METACLASS_$_Spot是编译器给Spot元类起的名字,也就是+[Spot class]返回的对象类型。

Xcode 8.2(或更早版本)默认创建 NSManagedObject 子类文件,如果您将实体 Codegen 模式设置为 Class DefinitionCategory/Extension

因此,如果您将实体设置为此模式...

不要使用Editor > Create NSManagedObject Subclass…手动生成,否则你将有两个副本和重复的符号。

auto-generated 文件位于派生数据文件夹中。您可以命令单击对象以获取它们的定义。

您可能会发现,在添加实体或进行重大更改时,需要一个清理->构建周期才能将其拾取。

如果您不希望此行为切换 CodegenManual/None

注意

2017 年 2 月 - 模板并非 100% 正确,生成的 class func fetchRequest() 由于模棱两可而无法使用。