Best Practice und Begründung: #import in .m oder .h

7

Was ist der Grund dafür, #import-Anweisungen in .m-Dateien anstelle von .h-Dateien in Objective-C zu platzieren?

Apple-Beispiele bündeln diese in der .m-Datei, sofern das Objekt nicht in der Schnittstellendeklaration (.h) verwendet wird, und die Dokumentation gibt an, dass dies korrekt ist ("In der Schnittstellendatei importieren Sie zuerst alle erforderlichen Headerdateien.")

Was mich verwirrt, ist, dass .h die Schnittstelle für die Implementierung definieren soll, also würde #import logischerweise auf die .h-Datei statt auf .m gehen.

    
Rudi 15.09.2009, 22:10
quelle

6 Antworten

8

In jeder Quelldatei sollten Sie nur # importieren, was Sie brauchen, um diese Datei für die Kompilierung gültig zu machen. Denken Sie daran, dass Ihre Header möglicherweise von anderen Klassen verwendet werden, daher sollten Sie sie so leicht wie möglich gestalten. Aus diesem Grund ist es auch besser, @class für Vorwärtsdeklarationen anderer Klassen als Ihre Oberklasse zu verwenden.

    
NSResponder 16.09.2009, 00:52
quelle
11

Wenn Sie all Ihre #import s in die Header-Dateien einfügen, können keine zwei Klassen voneinander abhängig sein, da eine Datei keine Datei importieren kann, die sie importiert. Wenn Sie stattdessen #import in die Implementierungsdatei einfügen, verschwindet das Problem.

    
Chuck 15.09.2009 22:19
quelle
4

Wenn die Schnittstelle Ihrer Klasse von der Schnittstelle einer anderen Klasse abhängt (dh wenn es sich um eine Unterklasse handelt), fügen Sie den Header hinzu, andernfalls deklarieren Sie die andere Klasse mit @class und fügen Sie den Interface-Header dieser Klasse in die Quelle der abhängigen Klasse ein Datei.

Die Argumentation ist einfach; Indem Sie nur Klassen im Header referenzieren, anstatt die gesamte Schnittstelle zu importieren, können Sie gegenseitig abhängige Klassen definieren (dh Klassen, die voneinander abhängig sind), andernfalls ist eine solche Einrichtung unmöglich, da rekursive Dateieinschlüsse auftreten würden (aber die Objective-C #import stellt sicher, dass das nicht passiert).

    
dreamlax 16.09.2009 00:54
quelle
2

Eine Schnittstelle ist typischerweise nur die Methoden, die die Klasse zur Verfügung stellt. Eine Schnittstelle kann eine beliebige Anzahl von austauschbaren Implementierungen haben. Der Import in die Implementierung statt in den Header verhindert, dass andere Implementierungen Klassen importieren, die möglicherweise nicht verwendet werden müssen. Es geht darum, Informationen zu verstecken und Code auf einer Basis zu halten, die man wissen muss.

    
Donnie C 15.09.2009 22:24
quelle
1
  

Was ist der Grund dafür, #import-Anweisungen in .m-Dateien anstelle von .h-Dateien in Objective-C zu platzieren?

Vielleicht haben Sie in einer der Methoden in der Implementierung eine lokale Variable eines Klassentyps instanziiert, die Sie nur ein- oder zweimal verwenden, und Sie möchten nicht, dass die #import -Anweisung Ihre Header-Datei durcheinanderbringt. Oder Sie haben @class in der Kopfzeile als Forward-Deklaration verwendet und müssen diese Klasse in Ihrer Implementierung mit der #import -Anweisung referenzieren.

    
Alex Reynolds 15.09.2009 22:14
quelle
1

Abgesehen von allem anderen ist es auch ein Leistungsgewinn für die Kompilierzeiten. Wenn Sie #import eine Datei verwenden, ist es so, als hätten Sie den Inhalt der Datei in Ihre Kopfzeile eingefügt. Das ist mehr, als dass der Compiler beim Kompilieren des Codes durchkommt.

Sehen Sie sich die Seite zur Clang-Compiler-Leistung an .

Beachten Sie, dass vorkompilierte Header einen Großteil des Problems bei Standardheadern wie Cocoa.h vermeiden.

    
Ken 16.09.2009 02:13
quelle

Tags und Links