2017-03-29 2 views
0

Ich habe zwei Header einer Klasse und es ist die Erweiterung (generiert von Xcode für NSManaged-Objekt). Aber ich bekomme einen Linker Fehler und ich fand heraus, dass es wegen einer zirkulären Referenz war.Linker Fehler aufgrund der Zirkelreferenz

Conversation + CoreDataClass.h

NS_ASSUME_NONNULL_BEGIN 

@interface Conversation : NSManagedObject 

@end 

NS_ASSUME_NONNULL_END 

#import "Conversation+CoreDataProperties.h" 

Conversation + CoreDataProperties.h

#import "Conversation+CoreDataClass.h" 

NS_ASSUME_NONNULL_BEGIN 

@interface Conversation (CoreDataProperties) 

+ (NSFetchRequest<Conversation *> *)fetchRequest; 

@end 

NS_ASSUME_NONNULL_END 

Sie können deutlich sehen, die zirkulären Verweis hier. Ich fand diese question, wo das Problem war, eine @class Deklaration hinzuzufügen und den Header zu entfernen. Also habe ich die import Anweisung im Conversation+CoreDataProperties.h auskommentiert und @class Conversation; hinzugefügt. Jetzt erscheinen zwei Fehler, die sagen, dass es eine undefinierte Klasse ist. Habe den Screenshot des Fehlers unten angehängt. Ich verstehe nicht ganz, warum das passiert und was ich tun muss, um es zu beheben. Jede Hilfe wird sehr geschätzt. Vielen Dank!

enter image description here

Linker Fehler

duplicate symbol _OBJC_CLASS_$_Conversation in: /Users/xxx/Library/Developer/Xcode/DerivedData/xxx-gbhivuwptwzhkldfbmjghkokozgn/Build/Intermediates/xxx.build/Debug-iphoneos/xxx.build/Objects-normal/arm64/Conversation+CoreDataClass.o duplicate symbol _OBJC_METACLASS_$_Conversation in: /Users/xxx/Library/Developer/Xcode/DerivedData/xxx-gbhivuwptwzhkldfbmjghkokozgn/Build/Intermediates/xxx.build/Debug-iphoneos/xxx.build/Objects-normal/arm64/Conversation+CoreDataClass.o duplicate symbol _OBJC_CLASS_$_ConversationDate in: /Users/xxx/Library/Developer/Xcode/DerivedData/xxx-gbhivuwptwzhkldfbmjghkokozgn/Build/Intermediates/xxx.build/Debug-iphoneos/xxx.build/Objects-normal/arm64/ConversationDate+CoreDataClass.o duplicate symbol _OBJC_METACLASS_$_ConversationDate in: /Users/xxx/Library/Developer/Xcode/DerivedData/xxx-gbhivuwptwzhkldfbmjghkokozgn/Build/Intermediates/xxx.build/Debug-iphoneos/xxx.build/Objects-normal/arm64/ConversationDate+CoreDataClass.o ld: 4 duplicate symbols for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

+0

Das ist ein bisschen seltsam. Versuchen Sie, Ihr Projekt zu reinigen (shift-cmd-K) und erstellen Sie es neu. – dirkgroten

+0

@dirkgroten Das hat nicht geholfen. Habe immer noch die Fehler. – ebby94

Antwort

0

die Lösung für mein Problem in diesem answer gefunden. Ich musste nur die .m-Dateien aus den Kompilierquellen entfernen.

0

So I commented out the import statement in the Conversation+CoreDataProperties.h and added @class Conversation;.

Sie dies nur tun, wenn Sie sind nicht der Convention Klasse-Schnittstelle (zum Beispiel unter Verwendung einer Eigenschaft des Typs deklarieren Convention Sie können dies nicht tun, wenn Sie Convention über eine Kategorie oder eine Klassenerweiterung erweitern

Sie haben eine legitime Zirkelreferenz hier müssen Sie auflösen. Sie können entweder:

  1. Bewegen Sie die Klasse und die Kategorie, in der gleichen Quelldatei (wenn es keinen besonderen Grund, dies in einer Kategorie sein muss man nur die Deklaration von fetchRequest in die Klasse bewegen konnte selbst).
  2. Beenden Sie den Import von +CoreDataProperties.h in den Klassenheader und importieren Sie ihn stattdessen überall dort, wo Anrufer fetchRequest aufrufen müssen.
+0

Die Änderungen machen es kompilieren, aber ich bekomme immer noch den Linker-Fehler für doppelte Symbole. Ich habe den Fehler in der Frage hinzugefügt – ebby94

0

die doppelte Symbole Warnung Sie führen, da

  1. Sie die Klasse mehrere Male in Ihrem Projekt und der Compiler nicht weiß, was zu wählen (dann ist es meist eine doppelte Verknüpfung Fehler)
  2. Es ist etwas falsch mit Ihrem ConversationDate + CoreDataClass

Nur eine Frage, die aus dem Quellcode angehoben: warum impo Sie rt eine Erweiterung der Klasse, die Sie erweitern möchten?

#import "Conversation+CoreDataClass.h" 
@interface Conversation (CoreDataProperties) 

+ (NSFetchRequest<Conversation *> *)fetchRequest; 

@end 

Alle Erweiterungsklasse in der Regel muss wissen, sind im Wesentlichen die Klassen, die sie verlängern:

#import "Conversation.h" 
@interface Conversation (CoreDataProperties) 

+ (NSFetchRequest<Conversation *> *)fetchRequest; 

@end 

Nur die Implementierungsdatei (.m) würde die Header-Datei importieren. E.g:

#import "Conversation+CoreDataClass.h" 
@implementation Conversation (CoreDataProperties) 

+ (NSFetchRequest<Conversation *> *)fetchRequest { 
    // body 
    return nil; 
} 

@end 

Und letzte Frage: Sind Sie sicher, dass keine andere Klassenerweiterung mit dem gleichen Namen in Ihrem Projekt gibt es? CoreData könnte sie auch selbst erstellt haben.

Bitte schauen Sie in Ihrem Xcode-Projekt wie folgt aus: Use lookup functionality on the bottom left of xCode

+0

Ich fand die Lösung für das Problem, eine Antwort geschrieben. Außerdem waren keine doppelten Dateien vorhanden. Bei der Frage "Warum importierst du eine Erweiterung der Klasse, die du erweitern willst?", Wurde diese automatisch von Xcode generiert :) Obwohl das Entfernen der Import-Anweisung und das direkte Verschieben des Erweiterungscodes in die Klasse nicht geholfen hat Das Thema. – ebby94

+0

Cool! Vergessen Sie nicht, Ihre eigene Antwort als Lösung zu markieren, damit der Thread geschlossen werden kann :) – Lepidopteron

+0

Ich kann es als nur nach einem Tag beantwortet markieren. Mach es morgen :) – ebby94