2009-09-01 4 views
1

Ich habe Probleme mit einem fremden Protokoll in Objective-C.Gibt es eine Möglichkeit, eine Protokolldefinition einer anderen Headerdatei zu verwenden?

Gibt es eine andere Lösung als das Hinzufügen zusätzlicher Protokolle?


Beispiel:

Class1.h

#import "Class2.h" 

@protocol Class1Delegate <NSObject> 
    @required 
    -(NSArray*) someMethod; 
@end 

@interface Class1 : NSObject 
{ 
    Class2 *variable; 

} ...

Class2.h

#import "Class1.h" 
@interface Class2: NSObject { 
    id <Class1Delegate> delegate; 
} 
@property (nonatomic,assign) id <Class1Delegate> delegate; 

Fehler:

Fehler: kann nicht Protokollerklärung für ‚Class1Delegate‘

Antwort

2

Es sollte so funktionieren, haben Sie es beschrieben finden. Bist du sicher, dass da nicht noch etwas anderes vor sich geht?

Wird Class1.h #import Class2.h?

Update:

Wenn Class1.h auch Class2.h importiert, dann sind Sie eine Header-Abhängigkeitsschleife haben:

Class1.h importiert Class2.h
Class2.h importiert Class1.h Hier

ist das Problem:

  1. der Compiler beginnt Arbeit an Class1.h
  2. Es läuft in die Zeile: `#import "Class2.h"
  3. Es öffnet Class2.h und beginnt mit der Arbeit dort
  4. Es findet die Zeile: #import Class1.h
  5. Es ignoriert diese Linie (zu eine Endlosschleife vermeiden)
  6. es wirft einen Fehler, weil Class2.h Dinge aus Class1.h erfordert, die noch nicht

Wie Sie es wirklich bis zu Ihnen lösen zusammengestellt worden, aber diese Art von Schleife eine Indicatio Wenn etwas mit Ihrem Design nicht stimmt. Eine schnelle Lösung könnte wie folgt aussehen:

Class1.h

@protocol Class1Delegate <NSObject> 
@required 
-(NSArray*) someMethod; 
@end 

#import "Class2.h" // moved here to avoid a cyclic dependency 

@interface Class1 : NSObject 
... 

Sie einfach bewegen, um die #import Linie nach das Protokoll erklärt wurde.

+0

Ja, es importiert Class2.h – jantimon

+1

Ah, dann ist da Ihr Problem. Sie haben eine Header-Abhängigkeitsschleife! Sie müssen die Dinge trennen. Ich werde in einer Sekunde weitere Details veröffentlichen. –

+0

Thx alot das macht Sinn – jantimon

1

Dies sollte gut funktionieren, da dieses Muster ständig verwendet wird (z. B. UIScrollViewDelegate definiert in UIScrollView.h, aber Sie können #import es und verwenden Sie es in einer View-Controller-Klasse-Deklaration).

Aus Neugier, implementiert Class2.m tatsächlich die erforderliche someMethod Methode?

Können wir mehr von der Fehlerausgabe sehen?

P.S. Sie sollten den Delegierten nicht behalten. Ihre @property Direktive sollte (nonatomic, assign) sein. Siehe Ownership of Delegates, Observers, and Targets.

+0

+1 für diesen Link! Netter Fund. –

+0

Klasse2 implementiert die Methode nicht, da sie die Methode nur an den Delegaten sendet – jantimon

Verwandte Themen