"Redefenición de 'categoría' como un tipo diferente de símbolo" y conflicto con los nombres de las clases de tiempo de ejecución de OBJC

StackOverflow https://stackoverflow.com/questions/20353408

  •  25-08-2022
  •  | 
  •  

Pregunta

Tengo una clase en Objective-C:

@interface Category : NSObject
{
// ...
}

Todo estaba bien y He usado esta clase sin problemas en 3 proyectos diferentes.

Una vez que decidí crear el objetivo de prueba para un proyecto. Luego ocurrió lo extraño: el compilador se niega a compilar con este error:

Redefenition of 'Category' as a different kind of symbol

También señaló runtime.h con

typedef struct objc_category *Category;

Bueno, es razonable.

Sin embargo, no puedo entender por qué me permitió usar esta clase antes y cuál es la diferencia entre el objetivo original y el objetivo de prueba. He comprobado Deploy target, iOS SDK, todas las macros, caminos de encabezado, #import <objc/runtime.h> y clases en ambos objetivos: estas son casi las mismas.

No quiero refactorizar el nombre de esta clase debido a usarlo en proyectos múltiples, entonces, ¿cuál puede ser la razón de tal comportamiento?

¿Fue útil?

Solución

Debe refactorizar el nombre de esta clase de todos modos, para evitar tales colisiones en el futuro. Y será menos doloroso hacerlo más temprano que tarde.

Es probable que importe un archivo que importe <objc/runtime.h> en algún momento. Como la cuestión de cuál es la diferencia entre el objetivo de prueba y el objetivo regular, en Xcode Testing funciona al inyectar los símbolos en un paquete. Puede haber algunas diferencias en la eliminación de código y la visibilidad de los símbolos que podrían explicar este tipo de error.

No es de extrañar Apple recomienda prefijo clases con 2 o 3 letras

Otros consejos

Aunque debes hacer lo que dice @olotiar en su respuesta, hay una solución rápida.

Ve a tu proyecto Configuración de construcción, buscar "Habilitar módulos (C y Objective-C)"y establecer el valor en NO.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top