web-dev-qa-db-ja.com

NSManagedObjectサブクラスを追加するときの重複シンボルエラー、重複リンク

NSManagedObjectサブクラス(2つの関連エンティティ)をXcodeで自動的に作成しようとしていました。これらは次のように生成されます。

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、上記と同じエラーが表示されました。

「二重インクルード」または「間違ったディレクトリにファイルを保存する」についていくつかの答えを見つけましたが、私はそれをしませんでした。誰もこれについて考えていますか?

34
KFZ

管理対象オブジェクトのサブクラスを自動的に生成しない場合は、データモデルインスペクターでエンティティの「コード生成」設定を確認することを忘れないでください。

enter image description here

50
Andrey Seredkin

編集:@iPeterからの助けのおかげで、次のことがわかりました:

[エディター]> [NSManagedObjectファイルの生成]を実行した後、ビルド前にファイルをゴミ箱に入れても、プロジェクトは問題なくビルドされます。

Trash these files

次に、「myManagedObjectName + CoreDataClass.h」(MO名はコアデータのエンティティインスペクターにあるもの)を、それらの管理対象オブジェクトを必要とするクラスに#importします。

つまり、フォルダーに実際のManagedObjectファイルは必要ありません。 Xcodeは、生成されたものを派生データフォルダーに保持します。

何らかの理由でこれらのファイルをファイルディレクトリに残す必要がある場合、次の回避策が機能します。ターゲットに移動し、コンパイルソースのCoreDataClassソースを削除します。

Before

これであなたを残します:

After

  • ManagedObjectサブクラスの初期生成後に追加した新しい属性/関係のほとんどは、ビルド後にプロパティとして使用できました。既存の関係の名前を変更した1つのケースでは、エディター> NSManagedObjectサブクラスを再度生成する必要がありました。その後、フォルダー内の新しいファイルを破棄し、ビルドし、すべてが正常に機能しました。

この情報を含むブログ投稿 興味のある人のために書いたばかりです。

41
Mike Critchley

これらのすべてのエンティティを削除し、Data Model Inspectorで「Codegen」設定を「Manual/None」に変更して、エンティティを再生成する必要があります。うまくいく! Compile Sourceから+ CoreDataClass.hファイルを削除する必要はありません。エンティティを抽象としてマークする必要はありません。自分でクラスを生成する必要はありません。 「Codegen」設定のみを変更し、エンティティを自動的に再生成する必要があります。 enter image description here

31
Earl0Grey

遅い投稿...しかし、私にとっては単にエンティティのコピーペーストでしたが、Xcodeはエンティティに関連付けられた元のクラス名を変更しないようです(Xcode 9.0.1で観察されました)

0
Chris

自分で生成したCoreData関連のサブクラスを削除する必要があり、#import行をそれらのクラスに保持できます。これらのファイルはすべて、プロジェクトのビルド時に自動的に生成されます。

0
FrogInNightCap