2009-07-13 10 views
5

Sto sviluppando un'applicazione per iPhone e sono un po 'nuovo per Objective-C e anche per la struttura class.h e class.m.Come posso avere riferimenti tra due classi in Objective-C?

Ora, ho due classi che hanno entrambe bisogno di avere una variabile del tipo dell'altro. Ma sembra impossibile.

Se in class1.m (o class2.m) includo class1.h e quindi class2.h, non posso dichiarare le variabili di classe2 in class1.h, se includo class2.h e quindi class1.h , Non posso dichiarare le variabili di classe1 in class2.h.

Spero che tu abbia avuto la mia idea, perché questo mi sta facendo impazzire. È davvero impossibile realizzarlo?

Grazie.

+4

Questo potrebbe essere quello che stai cercando: http://stackoverflow.com/questions/322597/objective-c-class-vs-import – teabot

risposta

20

È possibile utilizzare la parola chiave @class per inoltrare una classe nel file di intestazione. Ciò consente di utilizzare il nome della classe per definire le variabili di istanza senza dover #import il file di intestazione.

Class1.h

@class Class2; 

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

Class2.h

@class Class1; 

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

Si noti che si dovrà ancora #import il file di intestazione appropriata nei file .m

+1

+1 In effetti, alcune persone consigliano SOLO di farlo in questo modo all'interno del tuo proprio codice Poiché in genere è necessario solo il nome del tipo di classe nell'intestazione (per variabili, parametri e tipi di ritorno), questo tende a semplificare la catena di importazione e rende più veloce l'elaborazione di tutti i file di intestazione. Sicuramente vedi il link SO @teabot fornito appena sotto la domanda pure. –

+0

@Quinn Taylor: buon punto. Non uso quasi mai # # import nei miei file di intestazione, a meno che non sia richiesto per l'ereditarietà. –

+0

Grazie. Ma non sembra funzionare fino in fondo. Ricevo questo messaggio quando lo uso. "warning: receiver" Class2 "è una classe forward e l'interfaccia @ corrispondente potrebbe non esistere". E quando provo ad accedere a uno dei suoi componenti, si sbaglia che quel componente non esiste. Per intestazione appropriata intendi la propria intestazione? o entrambi? – treznik

3

A la dipendenza circolare è spesso un'indicazione di un problema di progettazione. Probabilmente una o entrambe le classi hanno troppe responsabilità. Un refactoring che può emergere da una dipendenza circolare sta spostando la funzionalità interdipendente nella propria classe che entrambe le classi originali consumano.

Puoi descrivere la funzionalità che ogni classe richiede dall'altro?

+0

Bene. In pratica, Class1 crea un'istanza di Class2, che attiva uno script che carica un'immagine esterna in modo asincrono e quando le immagini vengono caricate viene attivato un metodo da Class2, che deve attivare un metodo da Class1. Ci si potrebbe chiedere perché, dopo tutto, ho bisogno di Class2, dove ci sono alcune funzionalità aggiunte oltre al caricamento dell'immagine, quindi ne ho bisogno. Hmm, ho appena capito, posso memorizzare i riferimenti Class1 come un tipo ? – treznik

+0

Sembra un lavoro per un delegato o un evento. Class2 non ha bisogno di sapere che Class1 in particolare si preoccupa del completamento del caricamento dell'immagine, solo che ci sono altri là fuori che vogliono saperlo.Class2 dovrebbe esporre un evento/notifica che viene attivato quando il caricamento dell'immagine è completo. I consumatori sono responsabili della sottoscrizione e della scelta di cosa fare quando si verifica la notifica. –

+2

Qui ci sono molti modi per implementare una comunicazione liberamente accoppiata tra gli oggetti: http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html –

Problemi correlati