"Redéfinition de la« catégorie »comme un type de symbole différent» et conflit avec les noms de classe d'exécution OBJC

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

  •  25-08-2022
  •  | 
  •  

Question

J'ai une classe dans Objective-C:

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

Tout était bon et J'ai utilisé cette classe sans problème dans 3 projets différents.

Une fois, j'ai décidé de créer une cible de test pour un projet. Ensuite, la chose étrange s'est produite: le compilateur refuse de se compiler avec cette erreur:

Redefenition of 'Category' as a different kind of symbol

il a également souligné runtime.h avec

typedef struct objc_category *Category;

Eh bien, c'est raisonnable.

Cependant, je ne peux pas comprendre pourquoi il m'a permis d'utiliser cette classe avant et quelle est la différence entre la cible d'origine et la cible de test. j'ai vérifié Deploy target, iOS SDK, toutes les macros, les chemins d'en-tête, #import <objc/runtime.h> Et les classes dans les deux cibles - ce sont presque les mêmes.

Je ne veux pas refacter le nom de cette classe en raison de l'utiliser dans des projets multiples, alors quelle peut être la raison d'un tel comportement?

Était-ce utile?

La solution

Vous devez de toute façon refactor le nom de cette classe, pour éviter de telles collisions à l'avenir. Et il sera moins douloureux de le faire le plus tôt possible.

Il est probable que vous importez un fichier qui importe <objc/runtime.h> à un moment donné. Comme la question de la différence entre la cible de test et la cible régulière, le test Xcode fonctionne en injectant les symboles sur un faisceau. Il pourrait y avoir quelques différences de décapage de code et de visibilité des symboles qui pourraient expliquer ce type d'erreur.

Pas étonnant Apple recommande de préfixer les cours avec 2 ou 3 lettres

Autres conseils

Bien que vous deviez faire ce que dit @olotiar dans sa réponse, il y a une solution rapide.

Allez à votre projet Créer des paramètres, rechercher "Activer les modules (C et objectif-c)"Et définissez la valeur sur NON.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top