2009-05-07 5 views
4

Okay, das könnte eine sehr alberne Anfängerfrage sein, aber:Wie kann ich dieses Problem mit bidirektionalen Abhängigkeiten in Objective-C-Klassen lösen?

Ich habe eine ClassA, die ein untergeordnetes Objekt aus ClassB erstellt und das einer Instanzvariable zuweist. Im Einzelnen: ClassA wird ClassB im zugeordneten Initialisierer zuweisen und initialisieren und dies der ChildEbject-Instanzvariablen zuweisen. Es sieht Header so aus:

#import <Foundation/Foundation.h> 
#import "ClassB.h" 

@interface ClassA : NSObject { 
    ClassB *childObject; 
} 

@end 

Dann gibt es die Kopfzeile von ClassB. ClassB muss einen Verweis auf ClassA haben.

#import <Foundation/Foundation.h> 
#import "ClassA.h" 

@interface ClassB : NSObject { 
    ClassA *parentObject; 
} 

- (id)initWithClassA:(ClassA*)newParentObject; 

@end 

Wenn das KlasseA Objekt erstellt ein untergeordnetes Objekt von ClassB, dann ist das KlasseA Objekt den bestimmten Initialisierung des Objekts ClassB nennen, wo sie sich übergeben hat (Selbst-).

Ich fühle, dass etwas nicht stimmt, aber im Moment bekomme ich nicht genau, was es ist. Einer denke ich weiß, dass das nicht funktioniert. Sie können sich nicht gegenseitig importieren. Der Compiler sagt mir nur: "Fehler: Syntaxfehler vor 'ClassA'". Wenn ich die import-Anweisung für den Import von ClassA entferne, entferne die ClassA * parentObject-Instanzvariable und entferne den designers-Initialisierer (der ClassA-Referenz akzeptiert), dann funktioniert es.

Nun, hier ist, was ich erreichen möchte (wenn das wichtig ist): Ich brauche ein sehr spezielles und komplexes Verhalten in einem UIScrollView. Also habe ich beschlossen, es zu unterklassifizieren. Da der Hauptteil innerhalb der Delegate-Methoden ausgeführt wird, entschied ich mich, ein "generisches" Delegat-Objekt für meine Unterklasse von UIScrollView zu erstellen. Meine UIScrollView-Unterklasse erstellt dann automatisch dieses spezielle Delegatobjekt und weist es seiner Delegate-Eigenschaft zu. Das Delegat-Objekt selbst benötigt einen Verweis auf das übergeordnete Element, das benutzerdefinierte UIScrollView, damit es auf die Untersichten dieser Bildlaufansicht zugreifen kann. Aber selbst wenn es einen besseren Weg gibt, dieses Problem zu lösen, würde ich trotzdem gerne wissen, wie ich das mit zwei "voneinander abhängigen" Objekten, die einander brauchen, machen kann.

Alle Vorschläge sind willkommen!

+0

Erinnert mich an http://stackoverflow.com/questions/820808/objective-c-cocoa-proper-design-for-delegates-and-controllers – Kriem

+0

Ausgezeichnete, ausgezeichnete Frage. Ich habe das gerade gefunden und es beantwortet ein lang bestehendes Problem, das ich hatte. Danke auch für die tollen Antworten! –

Antwort

15

Sie müssen diese Klassen nicht in die Header-Dateien importieren. Verwenden Sie @class in den Header-Dateien, und verwenden Sie dann #import nur in den .m-Dateien:

// ClassA.h: 
@class ClassB; 
@interface ClassA : NSObject 
{ 
    ClassB *childObject; 
} 
@end 


// ClassA.m: 
#import "ClassA.h" 
#import "ClassB.h" 
@implementation ClassA 
//.. 
@end 


// ClassB.h 
@class ClassA; 
@interface ClassB : NSObject 
{ 
    ClassA *parentObject; 
} 
- (id)initWithClassA:(ClassA*)newParentObject; 
@end 


// ClassB.m: 
#import "ClassB.h" 
#import "ClassA.h" 
@implementation ClassB 
//.. 
@end 
5

Verwenden Sie @class A; und @class B; anstelle von #import s, um dem Compiler zu sagen, dass er sich nicht um die Klassendefinition kümmern muss, und einfach weitermachen, weil er später darauf stoßen wird.

Ersetzen Sie grundsätzlich #import "A.h" durch @class A;.

5

Sie müssen Ihre Klassen "weiterleiten", anstatt die vollständige Definition zu importieren.Zum Beispiel:

#import <Foundation/Foundation.h> 

@class ClassB; // Tell the compiler that ClassB exists 

@interface ClassA : NSObject { 
    ClassB *childObject; 
} 

@end 

Und Sie tun etwas Ähnliches für die ClassB-Header-Datei.

Verwandte Themen