36 votes

Dupliquer le symbole d'erreur lors de l'ajout d'NSManagedObject sous-classe, le lien dupliquer

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

enter image description here

Cependant, avant que je ne fais rien de plus, lorsque j'ai essayé de construire et exécuter, une erreur de lien se produire, 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.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)

J'ai essayé à plusieurs reprises par la création de nouveaux projets et faire la même chose. Mon intention de départ est d'ajouter quelques méthodes personnalisées dans ces classes. Mais quand je ajouter quelque chose par ex. Photo+CoreData.h/m, la même erreur que ci-dessus a montré jusqu'à.

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

58voto

Andrey Seredkin Points 521

Si vous ne génère pas de sous-classe d'objets gérés automatiquement, alors n'oubliez pas de cocher la case "Codegen" paramètres d'une Entité dans le Modèle de Données de l'Inspecteur:

enter image description here

43voto

Mike Critchley Points 11

Edit: Grâce à l'aide de @iPeter a révélé ce qui suit:

Après avoir fait l'Éditeur de > Générer NSManagedObject fichiers, si vous supprimez les fichiers AVANT de construire, votre projet doit construire pas de problèmes.

Trash these files

Alors #import "myManagedObjectName+CoreDataClass.h" (où le MO nom est celui de l'entité inspecteur dans la base de données) dans toutes les classes où vous avez besoin de ces Objets Gérés.

En d'autres termes, vous n'avez pas besoin de réelle ManagedObject fichiers dans votre dossier. Xcode garde le générés dans votre Dérivé du dossier de Données.

Si pour une raison quelconque vous avez besoin de ces fichiers restent dans votre répertoire de fichiers, la solution de contournement suivante de travail. Accédez à votre Cible et de supprimer les CoreDataClass sources Compiler les Sources.

Before

Vous laissant avec ceci:

After

  • La plupart des nouveaux attributs / relations que j'ai ajouté après la première génération de ManagedObject sous-classes ont été disponibles en tant que propriétés après une génération. Dans un cas où j'ai renommé une relation existante, j'ai eu à faire de l'Éditeur de > Générer NSManagedObject sous-classes de nouveau, puis je l'ai mis à la corbeille les fichiers dans mon dossier, construit, et tout a fonctionné.

Viens d'écrire un post de blog qui comprend cette info pour tous ceux qui sont intéressés.

33voto

Earl0Grey Points 459

Vous devez supprimer toutes ces entités, le changement "Codegen" paramètres "manual" (Manuel/None" pour eux dans le Modèle de Données de l'Inspecteur, et de générer à nouveau les entités. Il fonctionne bien! Vous n'avez pas besoin de supprimer +CoreDataClass.h des fichiers à partir de la Compilation de la Source. Vous n'avez pas besoin de marquer des entités abstraites. Vous n'avez pas besoin de générer des classes par vous-même. Vous devriez changer seulement "Codegen" paramètres et de régénérer les entités automatiquement. enter image description here

1voto

Chris Points 1

fin de post ... mais pour moi, c'était tout simplement un copier coller d'une entité, Xcode ne semble pas changer le nom de la classe associée à l'entité (observé sur Xcode 9.0.1)

0voto

FrogInNightCap Points 49

Vous devez supprimer les CoreData les sous classe générée par vous-même, et vous pouvez garder la ligne #import avec les classes, maintenant, tous les fichiers seront générés automatiquement lors de la construction du projet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X