"Neustufe der Kategorie" als eine andere Art von Symbol "und Konflikt mit OBJC -Laufzeitklassennamen

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

  •  25-08-2022
  •  | 
  •  

Frage

Ich habe eine Klasse in Objective-C:

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

Alles war gut und Ich habe diese Klasse ohne Probleme in 3 verschiedenen Projekten verwendet.

Sobald ich mich entschied, ein Testziel für ein Projekt zu erstellen. Dann kam das Seltsame: Compiler weigert sich, mit diesem Fehler zu kompilieren:

Redefenition of 'Category' as a different kind of symbol

es zeigte auch auf runtime.h mit

typedef struct objc_category *Category;

Nun, es ist vernünftig.

Ich kann jedoch nicht verstehen, warum ich diese Klasse vorher verwenden konnte und was der Unterschied zwischen dem ursprünglichen und Testziel ist. Ich habe überprüft Deploy target, iOS SDK, alle Makros, Headerpfade, #import <objc/runtime.h> und Klassen in beiden Zielen - diese sind fast gleich.

Ich möchte den Namen dieser Klasse nicht neu aufstellen, weil ich ihn in Multiples -Projekten verwendet habe. Was kann also der Grund für ein solches Verhalten sein?

War es hilfreich?

Lösung

Sie sollten den Namen dieser Klasse trotzdem neu aufbauen, um solche Kollisionen in Zukunft zu vermeiden. Und es wird weniger schmerzhaft sein, es früher als später zu tun.

Es ist wahrscheinlich, dass Sie eine Datei importieren, die importiert <objc/runtime.h> Irgendwann. In Bezug auf den Unterschied zwischen dem Testziel und dem regulären Ziel funktioniert bei Xcode -Tests, indem die Symbole auf ein Bündel injiziert werden. Möglicherweise gibt es einige Unterschiede in der Sichtbarkeit von Codestrippen und Symbolen, die diese Art von Fehler erklären könnten.

Kein Wunder Apple empfiehlt, Klassen mit 2 oder 3 Buchstaben zu präfixen

Andere Tipps

Obwohl Sie in seiner Antwort das tun sollten, was @olotiar sagt, gibt es eine schnelle Lösung.

Gehen Sie zu Ihrem Projekt Einstellungen erstellen, suchen nach "Aktivieren Sie Module (C und Objective-C)"und setzen Sie den Wert auf NEIN.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top