web-dev-qa-db-fra.com

Erreur de symbole en double lors de l’ajout de la sous-classe NSManagedObject, lien en double

J'essayais de créer automatiquement des sous-classes NSManagedObject (2 entités liées) dans Xcode. Ils sont générés comme ceci:

enter image description here

Cependant, avant de continuer, lorsque j'essayais de le construire et de l'exécuter, une erreur de liaison se produisait, comme indiqué:

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.oduplicate 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.oduplicate 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.oduplicate 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.old: 4 duplicate symbols for architecture x86_64clang: error: linker command failed with exit code 1 (use -v to see invocation)

J'ai essayé plusieurs fois en créant de nouveaux projets et fais la même chose. Mon intention initiale est d’ajouter des méthodes personnalisées dans celles des sous-classes. Mais quand j'ajoute quelque chose dans, par exemple Photo+CoreData.h/m, la même erreur que ci-dessus est apparue.

J'ai trouvé des réponses à propos de la "double inclusion" ou de "l'enregistrement de fichiers dans le mauvais répertoire", mais je ne l'ai pas fait. Quelqu'un a une idée à ce sujet? 

32
KFZ

Si vous ne générez pas automatiquement de sous-classe d'objets gérés, n'oubliez pas de vérifier les paramètres "Codegen" d'une entité dans l'inspecteur de modèle de données:

 enter image description here

49
Andrey Seredkin

Edit: Merci à l’aide de @iPeter, retrouvez les éléments suivants:

Après avoir créé Editeur> Générer des fichiers NSManagedObject, si vous les supprimez AVANT la construction, votre projet ne devrait générer aucun problème. 

 Trash these files

Ensuite, importez #import "myManagedObjectName + CoreDataClass.h" (où le nom de l'agent de gestion est celui de l'inspecteur d'entités dans les données de base) dans les classes pour lesquelles vous avez besoin de ces objets gérés. 

En d'autres termes, vous n'avez besoin d'aucun des fichiers ManagedObject réels dans votre dossier. Xcode conserve les fichiers générés dans votre dossier Derived Data. 

Si, pour une raison quelconque, vous avez besoin que ces fichiers restent dans votre répertoire, la solution de contournement suivante fonctionnera. Accédez à votre cible et supprimez les sources CoreDataClass dans vos sources de compilation.

 Before

Vous laissant avec ceci:

 After

  • La plupart des nouveaux attributs/relations que j'ai ajoutés après la génération initiale des sous-classes ManagedObject étaient disponibles en tant que propriétés après une construction. Dans un cas où j'ai renommé une relation existante, je devais refaire la tâche Editeur> Générer les sous-classes NSManagedObject, puis jeté les nouveaux fichiers de mon dossier, ma construction, et tout fonctionnait correctement.

Je viens d'écrire un article de blog contenant cette information pour quiconque est intéressé. 

41
Mike Critchley

Vous devez supprimer toutes ces entités, remplacer les paramètres "Codegen" par "Manuel/Aucun" dans l'inspecteur de modèles de données et générer à nouveau des entités. Ça marche bien! Vous n'avez pas besoin de supprimer les fichiers + CoreDataClass.h de Compile Source. Vous n'avez pas besoin de marquer les entités comme abstraites. Vous n'avez pas besoin de générer des cours par vous-même. Vous ne devez modifier que les paramètres "Codegen" et régénérer les entités automatiquement .  enter image description here

30
Earl0Grey

post tardif ... mais pour moi était simplement un copier/coller d'une entité, Xcode ne semble pas modifier le nom de classe d'origine associé à l'entité (observé sur Xcode 9.0.1)

0
Chris

Vous devez supprimer la sous-classe liée à CoreData générée par vous-même et conserver la ligne #import avec ces classes. Désormais, tous ces fichiers seront générés automatiquement lors de la génération du projet.

0
FrogInNightCap