2009-07-13 5 views
5

Je développe une application iPhone, et je suis un peu nouveau sur Objective-C et aussi sur la structure class.h et class.m.Comment puis-je avoir des références entre deux classes en Objective-C?

Maintenant, j'ai deux classes qui doivent toutes deux avoir une variable du type de l'autre. Mais cela semble juste impossible. Si dans class1.m (ou class2.m) j'include class1.h, puis class2.h, je ne peux pas déclarer de classe2 dans class1.h, si j'inclue class2.h puis class1.h , Je ne peux pas déclarer les variables class1 dans class2.h.

J'espère que vous avez eu mon idée, parce que cela me rend fou. Est-ce vraiment impossible d'accomplir cela?

Merci.

+4

Cela pourrait être ce que vous cherchez: http://stackoverflow.com/questions/322597/objective-c-class-vs-import – teabot

Répondre

20

Vous pouvez utiliser le mot-clé @class pour déclarer une classe dans le fichier d'en-tête. Cela vous permet d'utiliser le nom de classe pour définir les variables d'instance sans avoir à #import le fichier d'en-tête.

Class1.h

@class Class2; 

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

Class2.h

@class Class1; 

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

Notez que vous aurez toujours à #import le fichier d'en-tête approprié dans vos fichiers .m

+1

+1 En fait, certaines personnes recommandent fortement de le faire de cette façon au sein de votre propre code. Puisque vous n'avez généralement besoin que du nom du type de classe dans l'en-tête (pour les variables, les paramètres et les types de retour), cela tend à simplifier votre chaîne d'importation et à accélérer le traitement de tous les fichiers d'en-tête. Vraiment voir le lien SO @teabot fourni juste en dessous de la question aussi bien. –

+0

@ Quinn Taylor: bon point. Je n'utilise presque jamais '# import 'dans mes propres fichiers d'en-tête, sauf si cela est requis pour l'héritage. –

+0

Merci. Mais cela ne semble pas fonctionner complètement. Je reçois ce message quand je l'utilise. "warning: le récepteur" Class2 "est une classe forward et l'interface @ correspondante peut ne pas exister". Et quand j'essaie d'accéder à l'un de ses composants, il se trompe sur le fait que ce composant n'existe pas. Par en-tête approprié, vous voulez dire que c'est propre en-tête? ou les deux? – treznik

3

A La dépendance circulaire est souvent une indication d'un problème de conception. Probablement une ou les deux classes ont trop de responsabilités. Un refactoring qui peut émerger d'une dépendance circulaire déplace la fonctionnalité interdépendante dans sa propre classe que les deux classes originales consomment toutes deux. Pouvez-vous décrire les fonctionnalités que chaque classe requiert de l'autre?

+0

Eh bien. Fondamentalement Class1 crée une instance de Class2, qui déclenche un script qui charge une image externe de manière asynchrone, et lorsque les images sont chargées, une méthode de Class2 est déclenchée, qui doit déclencher une méthode à partir de Class1. Vous vous demandez peut-être pourquoi j'ai besoin de Class2 après tout, où il y a des fonctionnalités supplémentaires en plus de la charge d'image, donc j'en ai besoin. Hmm, je viens de réaliser, puis-je stocker les références Class1 en tant que type ? – treznik

+0

Cela ressemble à un travail pour un délégué ou un événement. Class2 n'a pas besoin de savoir que Class1, en particulier, se soucie du chargement de l'image, juste qu'il y en a d'autres qui veulent en savoir plus.Class2 doit exposer un événement/une notification qu'il déclenche lorsque le chargement de l'image est terminé. Les consommateurs sont responsables de s'abonner et de choisir quoi faire lorsque la notification se produit. –

+2

Voici plusieurs façons de mettre en œuvre une communication faiblement couplée entre des objets: http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html –

Questions connexes