ios - Error de símbolo duplicado al agregar la subclase NSManagedObject, enlace duplicado
xcode objective-c-category (6)
Debe eliminar la subclase relacionada con CoreData generada por usted mismo y puede mantener la línea #import con esas clases, ahora todos esos archivos se generarán automáticamente cuando genere el proyecto.
Estaba intentando crear subclases NSManagedObject (2 entidades relacionadas) automáticamente en Xcode. Se generan así:
Sin embargo, antes de hacer algo más, cuando intenté compilarlo y ejecutarlo, se produce un error de enlace, como se muestra:
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)
Intenté varias veces creando nuevos proyectos y haciendo lo mismo. Mi intención original es agregar algunos métodos personalizados a las subclases. Pero cuando agrego algo en, por ejemplo, Photo+CoreData.h/m
, Photo+CoreData.h/m
el mismo error que el anterior.
Encontré algunas respuestas sobre "doble inclusión" o "guardar archivos en el directorio incorrecto", pero no lo hice. ¿Alguien tiene alguna idea sobre esto?
Debe eliminar todas estas entidades, cambiar la configuración de "Codegen" a "Manual / Ninguna" para ellos en el inspector de modelo de datos y generar entidades nuevamente. Funciona bien No es necesario eliminar los archivos + CoreDataClass.h de Compile Source. No es necesario marcar las entidades como abstractas. No necesitas generar clases por ti mismo. Debe cambiar solo la configuración de "Codegen" y regenerar entidades automáticamente.
Edit: Gracias a la ayuda de @iPeter, encontré lo siguiente:
Después de hacer Editor> Generar archivos NSManagedObject, si destruye los archivos ANTES de crearlos, su proyecto no debería generar problemas.
Luego, #importar "myManagedObjectName + CoreDataClass.h" (donde el nombre de MO es el del inspector de entidades en datos centrales) en cualquier clase en la que requiera esos Objetos administrados.
En otras palabras, no necesita ninguno de los archivos ManagedObject reales en su carpeta. Xcode mantiene los generados en su carpeta de Datos Derivados.
Si por alguna razón necesita que esos archivos permanezcan en su directorio de archivos, la siguiente solución funcionará. Vaya a su destino y elimine las fuentes CoreDataClass en sus fuentes de compilación.
Dejándote con esto:
- La mayoría de los nuevos atributos / relaciones que agregué después de la generación inicial de subclases ManagedObject estaban disponibles como propiedades después de una compilación. En un caso en el que cambié el nombre de una relación existente, tuve que volver a hacer Editor> Generar subcategorías NSManagedObject, luego trashé los nuevos archivos en mi carpeta, los construí y todo funcionó bien.
Acaba de escribir una entrada de blog que incluye esta información para cualquier persona interesada.
Recientemente probé la respuesta anterior y falló. De alguna manera, Xcode seguía generando los archivos.
Lo resolví utilizando el siguiente método:
- Marcar todas las entidades como Resumen
- Construir
- Eliminar bandera abstracta
- Construir
- El exito
Esto suena como un error en Xcode ...
publicación tardía ... pero para mí fue simplemente una copia de una entidad, Xcode no parece cambiar el nombre de clase original asociado con la entidad (observado en Xcode 9.0.1)