2009-07-13 15 views
5

Estoy desarrollando una aplicación para iPhone, y soy un poco nuevo en Objective-C y también en la estructura class.h y class.m.¿Cómo puedo tener referencias entre dos clases en Objective-C?

Ahora, tengo dos clases que ambas necesitan tener una variable del tipo del otro. Pero parece imposible.

Si en class1.m (o class2.m) incluyo class1.h, y luego class2.h, no puedo declarar las variables de clase2 en class1.h, si incluyo class2.h y luego class1.h , No puedo declarar las variables class1 en class2.h.

Espero que tengas mi idea, porque esto me está volviendo loco. ¿Es realmente imposible lograr esto?

Gracias.

+4

Esto podría ser lo que está buscando: http://stackoverflow.com/questions/322597/objective-c-class-vs-import – teabot

Respuesta

20

Puede usar la palabra clave @class para reenviar-declarar una clase en el archivo de encabezado. Esto le permite usar el nombre de la clase para definir variables de instancia sin tener que #import el archivo de encabezado.

Class1.h

@class Class2; 

@interface Class1 
{ 
    Class2 * class2_instance; 
} 
... 
@end 

Class2.h

@class Class1; 

@interface Class2 
{ 
    Class1 * class1_instance; 
} 
... 
@end 

Tenga en cuenta que todavía tendrá que #import el archivo de cabecera apropiado en sus archivos .m

+1

+1 De hecho, algunas personas recomiendan encarecidamente SOLO hacerlo de esta manera dentro de su propio código. Como generalmente solo necesita el nombre de tipo de clase en el encabezado (para variables, parámetros y tipos de devolución), esto tiende a simplificar su cadena de importación y hace que todos los archivos de encabezado sean más rápidos de procesar. Definitivamente, vea el enlace SO @teabot proporcionado también debajo de la pregunta. –

+0

@Quinn Taylor: buen punto. Casi nunca uso '# import' en mis propios archivos de encabezado, a menos que sea necesario para la herencia. –

+0

Gracias. Pero parece que no funciona todo el camino. Recibo este mensaje cuando lo uso. "warning: receiver" Class2 "es una clase forward y la interfaz @ correspondiente puede no existir". Y cuando trato de acceder a uno de sus componentes, se daña que ese componente no existe. ¿Por encabezado apropiado quieres decir que es tu propio encabezado? o ambos? – treznik

3

Un la dependencia circular es a menudo una indicación de un problema de diseño. Probablemente una o ambas clases tengan demasiadas responsabilidades. Una refactorización que puede surgir de una dependencia circular está moviendo la funcionalidad interdependiente a su propia clase que las dos clases originales consumen.

¿Puede describir la funcionalidad que cada clase requiere del otro?

+0

Bueno. Básicamente, Class1 crea una instancia de Class2, que desencadena un script que carga una imagen externa de forma asincrónica, y cuando se cargan las imágenes se activa un método de Class2, que debe iniciar un método desde Class1. Quizás se pregunte por qué necesito Class2 después de todo, donde hay algunas funcionalidades adicionales además de la carga de la imagen, así que lo necesito. Hmm, me acabo de dar cuenta, ¿puedo almacenar las referencias Class1 como un tipo ? – treznik

+0

Suena como un trabajo para un delegado o evento. Class2 no necesita saber que Class1 en particular se preocupa por la carga de la imagen, solo que hay otros que quieren saber sobre ella.La clase 2 debe exponer un evento/notificación que se activa cuando se completa la carga de la imagen. Los consumidores son responsables de suscribirse y elegir qué hacer cuando se produce la notificación. –

+2

Aquí hay muchas maneras de implementar la comunicación débilmente acoplada entre objetos: http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html –

Cuestiones relacionadas