2008-10-31 6 views
30

Ich habe mich in den letzten Monaten selbst Objective-C beigebracht (ich bin ein Java-Kopf) und ich habe mein Gehirn jetzt um das meiste gewickelt. Eine Sache, die mich im Moment verwirrt: Was ist der Unterschied zwischen dem Importieren einer Klasse über @class und dem Ausführen eines #import?Was ist der Unterschied zwischen #import und @class, und wann sollte ich einen über den anderen verwenden?

Ist einer besser als der andere, oder muss ich in bestimmten Fällen einen statt des anderen verwenden? Ich habe bisher nur #import benutzt.

Antwort

66

#import bringt die gesamte Header-Datei in Frage in die aktuelle Datei; alle Dateien, die diese Datei #import s sind ebenfalls enthalten. @class, andererseits (wenn es in einer Zeile mit einigen Klassennamen verwendet wird), sagt nur dem Compiler "Hey, du wirst bald ein neues Token sehen; es ist eine Klasse, also behandle es so." Diese

ist sehr nützlich, wenn Sie das Potenzial haben für ‚zirkuläre enthält‘, dh macht Object1.h Bezug auf Object2 und Object2.h verweist auf Object1 Wenn Sie #import beide Dateien in die andere, die. Compiler kann verwirrt, wie es zu #import Object1.h versucht, sieht darin und sieht Object2.h, es versucht zu #import Object2.h und sieht Object1.h usw.

Wenn auf der anderen Seite, die jeweils von diesen Dateien hat @class Object1; oder @class Object2;, dann gibt es keinen Zirkelverweis t sicher sein, tatsächlich #import die erforderlichen Header in Ihre Implementierung (. M) -Dateien.

+2

Ben, Ben, Sie müssen nicht jede Cocoa Frage auf Stack-Überlauf beantworten. Du wirst ausbrennen! – schwa

+2

muss ... aufhören ... beantworten ... –

5

Die andere Sache, die Sie im Gedächtnis behalten sollten ist, dass #imports Ihre Kompilierzeiten verlangsamen, da es bedeutet, dass der Compiler viel mehr Header-Dateien ziehen und durcharbeiten muss. Dies wird größtenteils durch die Verwendung von vorkompilierten Headern verdeckt, aber gelegentlich wurden mir Projekte übergeben, die jeden Header importiert haben, statt @class zu verwenden, und wenn sie behoben werden, kann die Kompilierzeit verbessert werden. Es ist subtil, wie das System die Tatsache verstärkt, dass, wenn Sie nur das verwenden, was Sie tatsächlich brauchen, die Dinge schneller gehen.

Als allgemeine Regel verwende ich immer @ class Deklarationen in meinen Header-Dateien und nur # importieren die Oberklasse. Das passt zu Bens Vorschlägen, aber ich denke, es ist erwähnenswert, dass selbst wenn Sie sich keine Gedanken über zirkuläre Referenzen machen, es sinnvoll ist, #imports in Header-Dateien zu beschränken, wenn Sie können.

27

@class heißt Forward-Deklaration. Sie sagen dem Compiler im Grunde, dass die Klasse existiert, aber nichts über die Klasse. Es kennt also nichts wie seine Oberklasse und welche Methoden es deklariert.

Verwenden Sie in der Regel @class in der .h und #import in der .m, wenn überhaupt möglich. Wie Louis sagte, wird es die Kompilierungszeiten beschleunigen. Es gibt Zeiten, wenn Sie eine Klasse in der Kopfzeile benötigen, obwohl #import. Fälle, die ich gerade jetzt denken kann:

  • Sie sind Subklassen eine andere Klasse
  • Du

In diesen Fällen ein Protokoll implementieren, müssen Sie die Header-Datei #import wo die Klasse oder Protokoll deklariert, weil der Compiler die gesamte Klassenhierarchie seiner Elternklassen und Implementierungsprotokolle kennen muss.

FWIW, können Sie weiterleiten Protokolle erklären auch, so lange, wie Ihr sie nicht Umsetzung:

@protocol SomeProtocol; 

@interface ... 

- (id<SomeProtocol>)someMethod; 

@end 
Verwandte Themen