Esto tiene que ver con el orden en que los archivos de origen se compilan en Ya está probablemente consciente de que no se puede llamar a un método antes de que se define (véase más adelante pseudocódigo):
var value = someMethod();
function someMethod()
{
...
}
Este causaría un error en tiempo de compilación porque someMethod() aún no se ha definido. Lo mismo es cierto de las clases. Las clases son compiladas una después de la otra por el compilador.
Por lo tanto, si imagina que todas las clases se colocan en un archivo gigante antes de la compilación, es posible que ya pueda ver el problema. Echemos un vistazo a la clase Ship
y BoatYard
:
@interface BoatYard : NSObject
@property (nonatomic, retain) Ship* currentShip;
@end
@interface Ship : NSObject
@property (nonatomic, retain) NSString* name;
@property (nonatomic, assign) float weight;
@end
Una vez más, porque la clase Ship
aún no se ha definido, no podemos referirnos a ella todavía. Resolver este problema en particular es bastante simple; cambiar el orden de compilación y compilar. Estoy seguro de que está familliar con esta pantalla en XCode:
Pero ¿Sabe usted que puede arrastrar los archivos arriba y hacia abajo en la lista? Esto cambia el orden en que se compilarán los archivos. Por lo tanto, solo mueve la clase Ship
por encima de la clase BoatYard
, y todo está bien.
Pero, ¿qué pasa si no quieres hacer eso, o más importante, qué pasa si hay una relación circular entre los dos objetos? Vamos a aumentar la complejidad de ese diagrama de objetos mediante la adición de una referencia a la corriente BoatYard
que el Ship
está en:
@interface BoatYard : NSObject
@property (nonatomic, retain) Ship* currentShip;
@end
@interface Ship : NSObject
@property (nonatomic, retain) BoatYard* currentBoatYard;
@property (nonatomic, retain) NSString* name;
@property (nonatomic, assign) float weight;
@end
Oh querido, ahora tenemos un problema. Estos dos no pueden compilarse uno al lado del otro. Necesitamos una manera de informar al compilador que la clase Ship * realmente existe. Y esta es la razón por la cual la palabra clave @class
es muy útil.
Para ponerlo en términos sencillos, dices, "créeme, hombre, Ship
realmente existe, y lo verás muy pronto". Para poner todo junto:
@class Ship;
@interface BoatYard : NSObject
@property (nonatomic, retain) Ship* currentShip;
@end
@interface Ship : NSObject
@property (nonatomic, retain) BoatYard* currentBoatYard;
@property (nonatomic, retain) NSString* name;
@property (nonatomic, assign) float weight;
@end
Ahora el compilador sabe ya que compila BoatYard
, que una definición de clase Ship
pronto aparecerá. Por supuesto, si no lo hace, la compilación seguirá teniendo éxito.
Toda la palabra clave @class
sin embargo, le informa al compilador que la clase llegará pronto. Es no un reemplazo para #import
.No obstante, debe importar el archivo de cabecera, o que no tendrá acceso a ninguna de las partes internas de clase:
@class Ship
-(void) example
{
Ship* newShip = [[Ship alloc] init];
}
Esto no puede trabajar, y se producirá un error con un mensaje de error diciendo que la nave es una declaración hacia adelante. Una vez que #import "Ship.h"
, podrá crear la instancia del objeto.
parece estar bien ... ¿puedes publicar una parte de tu código? – Devarshi
también ... ¿es ANObject parte de algún otro framework? – Devarshi
Edite su pregunta para incluir tanto el contenido de ANObject.hy el encabezado que le está dando el problema. Y muestre su código real, no el código inventado que puede no incluir el problema. –