NSManagedObjectサブクラス(2つの関連エンティティ)をXcodeで自動的に作成しようとしていました。これらは次のように生成されます。
ただし、さらに処理を行う前に、ビルドして実行しようとすると、次のようなリンクエラーが発生します。
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
、上記と同じエラーが表示されました。
「二重インクルード」または「間違ったディレクトリにファイルを保存する」についていくつかの答えを見つけましたが、私はそれをしませんでした。誰もこれについて考えていますか?
編集:@iPeterからの助けのおかげで、次のことがわかりました:
[エディター]> [NSManagedObjectファイルの生成]を実行した後、ビルド前にファイルをゴミ箱に入れても、プロジェクトは問題なくビルドされます。
次に、「myManagedObjectName + CoreDataClass.h」(MO名はコアデータのエンティティインスペクターにあるもの)を、それらの管理対象オブジェクトを必要とするクラスに#importします。
つまり、フォルダーに実際のManagedObjectファイルは必要ありません。 Xcodeは、生成されたものを派生データフォルダーに保持します。
何らかの理由でこれらのファイルをファイルディレクトリに残す必要がある場合、次の回避策が機能します。ターゲットに移動し、コンパイルソースのCoreDataClassソースを削除します。
これであなたを残します:
この情報を含むブログ投稿 興味のある人のために書いたばかりです。
遅い投稿...しかし、私にとっては単にエンティティのコピーペーストでしたが、Xcodeはエンティティに関連付けられた元のクラス名を変更しないようです(Xcode 9.0.1で観察されました)
自分で生成したCoreData関連のサブクラスを削除する必要があり、#import行をそれらのクラスに保持できます。これらのファイルはすべて、プロジェクトのビルド時に自動的に生成されます。