Kopfzeile in Ziel importieren c

8

In Objective-c, wenn wir das Objekt einer Klasse per Konvention in einer anderen Klasse verwenden, sollten wir die Klasse in der .h-Datei deklarieren, d. h. @class classname; . Und sollte die Headerdatei in der .m-Datei importieren, d. H.% Co_de%. Aber wenn wir die Header-Datei in .h importieren, müssen wir sie nicht erneut in die .m-Datei importieren. Was ist der Grund für diese Konvention? Was ist ein effizienter Weg?

    
V-Xtreme 10.05.2012, 10:09
quelle

5 Antworten

16
  

Was ist der Grund für diese Konvention?

Sie sollten Vorwärtsdeklarationen ( @class MONClass; ) bevorzugen, da der Compiler wissen muss, dass ein Typname eine objc-Klasse ist, bevor er verwendet wird, und weil ein #import eine Tonne anderer Header (z. B. ganze Frameworks) ziehen kann / Bibliotheken), die Ihre Abhängigkeiten ernsthaft erweitern und verkomplizieren und Ihre Build-Zeiten erhöhen.

  

Was ist ein effizienter Weg?

Vorwärtsdeklarationen. Ihre Builds, Neuerstellungen und Indexierungen werden viel schneller, wenn Sie dies richtig machen.

    
justin 10.05.2012, 10:16
quelle
4

Sie haben Recht, dass das Importieren des Headers in der .h-Datei (auf kurze Sicht) einfacher ist. Der Grund, dies nicht zu tun und in die Implementierungsdatei (.m) zu importieren, ist die Vermeidung von Namensverschmutzungen, bei der alle Namen in der importierten Kopfzeile verfügbar sind, wenn jemand Ihre Kopfzeile importiert. Stattdessen sollten Sie beim Importieren Ihrer Kopfzeile nur Ihre Funktionen / Klassen importieren und den Rest bei der Implementierung

Wenn Sie den Header in die .h importieren, bedeutet dies auch, dass jeder Code, der den Header importiert hat, neu kompiliert werden muss, wenn sich der Header des Drittanbieters ändert, auch wenn sich in Ihrem Header nichts explizit geändert hat. Die Forward-Deklaration vermeidet dieses Problem und erzwingt, dass nur Implementierungsdateien (.m) neu kompiliert werden, die tatsächlich den Header 3rd-Party verwenden

    
Attila 10.05.2012 10:13
quelle
2

Obwohl der Import von Dateien in .m es einfacher macht, mit wenigen Zeilen Code davonzukommen, aber es ist allgemein anzunehmen, dass der Import die Ladezeit und die Antwortzeit beeinflussen kann, ja, es betrifft und nicht. Weil laut Dokumentation von Apfel: -

  

Wenn Sie befürchten, dass die Erstellung einer Master-Headerdatei zu einem Aufblähen Ihres Programms führen kann, machen Sie sich keine Sorgen. Da Mac OS X-Schnittstellen mithilfe von Frameworks implementiert werden, befindet sich der Code für diese Schnittstellen in einer dynamischen gemeinsam genutzten Bibliothek und nicht in der ausführbaren Datei. Darüber hinaus wird zur Laufzeit immer nur der von Ihrem Programm verwendete Code in den Speicher geladen, so dass Ihr In-Memory-Footprint in ähnlicher Weise klein bleibt.

     

Wenn Sie beim Kompilieren eine große Anzahl von Header-Dateien mit einbeziehen, machen Sie sich keine Sorgen. Xcode bietet eine vorkompilierte Header-Funktion, um die Kompilierungszeiten zu beschleunigen. Wenn Sie alle Framework-Header gleichzeitig kompilieren, müssen die Header nicht neu kompiliert werden, es sei denn, Sie fügen ein neues Framework hinzu. In der Zwischenzeit können Sie jede Schnittstelle aus den enthaltenen Frameworks mit geringer oder keiner Leistungseinbuße verwenden.

Somit sind die Antwort- und Ladezeiten nur zum ersten Mal betroffen. Aber trotzdem sollte Vorwärts-Referenzierung bevorzugt werden, um Codierungsstandards beizubehalten und Overheads zu vermeiden, jedoch klein:).

    
Abhishek Singh 10.05.2012 11:13
quelle
0

dieser jst, um Compiler zu sagen, wir haben eine Klasse mit dem Namen xx, wenn Sie @class xx;

verwenden

beczy braucht jetzt seine Eigenschaften / Methode rite.

und im nächsten Fall benötigen Sie auch die Eigenschaft und die Methoden, auf die Sie zugreifen müssen. Das ist das Problem, wenn Sie @class xx in Ihrer .h-Datei verwenden und xx.h nicht importieren. dann deklariert ein Objekt von xx wird nicht erzeugt und Fehler, aber der Zugriff auf seine Methode wird eine Warnung generieren und Zugriff auf Eigentum generieren einen Fehler

    
Saad 10.05.2012 10:11
quelle
0

#import ist eine Preprozessor-Direktive, die die Datei bearbeitet, bevor der Compiler sie sieht. Wenn Sie verwirrt werden, denken Sie im Prinzip wie beim Kopieren und Einfügen: Wenn Sie #import foo sehen, bedeutet das, dass der Inhalt der Datei foo an dieser Stelle eingefügt wird. (Es ist ein bisschen schlauer als das, da es auch vor doppelten Einschlüssen schützt).

Sie haben also #import Foo.h in Bar.h , wenn es Deklarationen in Bar.h gibt, die auf Foo.h verweisen. Wenn in Bar.h nichts vorhanden ist, das Foo verwendet, aber Bar.m , dann wird der Import in Bar.m ausgeführt. Bewahren Sie die Deklarationen nur dort auf, wo sie gebraucht werden.

    
ckhan 10.05.2012 10:17
quelle