Regla básica: use @class
en su archivo de encabezado y #import
en su archivo de implementación. (Sin embargo, es necesario #import
superclase su clase. Y en algunas otras circunstancias también necesita usar `import" en el encabezado.)
#import
no es equivalente a #include
. Si un archivo es included
muchas veces , se cargará cada vez, pero con muchos #imports
del mismo archivo, solo se cargará una vez.
Por lo tanto, la razón principal para usar @class
no es evitar las dependencias circulares, sino hacer que la compilación sea más rápida.
Aquí hay un ejemplo de cuándo debe usar @class
//MYControl.h
@class MYControl; // Must use class
@protocol MYControlDelegate
-(void)control:(MYControl *)control didChangeToState:(UIControlState)state;
@end
@interface MYControl : UIControl
{
id<MYControlDelegate> delegate_;
}
@property (nonatomic, assign) id<MYControlDelegate> delegate;
@end
//MYControl.m
@implementation MYControl
@synthesize delegate = delegate_;
. . .
En este caso, no hay nada que importar, ya que el protocolo delegado se declara por encima de la clase principal en el archivo de cabecera. Pero aún necesita poder referirse a la clase principal que aún no ha sido declarada. Entonces, lo que hace @class
es dejar que el compilador sepa que hay alguna clase que se llama MYControl
y se definirá en algún momento. (No en tiempo de ejecución, sin embargo. La clase se definirá en el transcurso de la compilación.)
EDIT: Desde el manual de Objective-C:
Since declarations like this simply use the class name as a type and don’t depend on any details of the class interface (its methods and instance variables), the @class directive gives the compiler sufficient forewarning of what to expect. However, where the interface to a class is actually used (instances created, messages sent), the class interface must be imported. Typically, an interface file uses @class to declare classes, and the corresponding implementation file imports their interfaces (since it will need to create instances of those classes or send them messages).
The @class directive minimizes the amount of code seen by the compiler and linker, and is therefore the simplest way to give a forward declaration of a class name. Being simple, it avoids potential problems that may come with importing files that import still other files. For example, if one class declares a statically typed instance variable of another class, and their two interface files import each other, neither class may compile correctly.
Tenga en cuenta que la circularidad es mencionada en la última frase como uno en una clase general de los temas tratados mediante el uso de @class
.
En su caso, hay algo mal en su archivo RootViewController.h, o uno de los archivos que importa. Tal vez un desaparecido ";" algun lado. Desgraciadamente, es un poco difícil depurar archivos de encabezado porque a menudo se obtiene el error en otro archivo. La razón por la que no obtiene el error cuando utiliza @class es que no carga el archivo que contiene el error. Ver mi respuesta para más detalles. – Felixyz
posible duplicado de [Objective-C @class vs. #import] (http://stackoverflow.com/questions/322597/objective-c-class-vs-import) – willcodejavaforfood