Frage

Ich habe ein Protokoll:

@protocol Gadget <NSObject>

@property (readonly) UIView *view;

- (void) attachViewToParent:(UIView *)parentView;

@end

Und eine „abstrakte“ Basisklasse mit einer Implementierung (als Getter, nicht gezeigt) von -(UIView *)view:

// Base functionality
@interface AbstractGadget : NSObject {
    UIView *view;
}

@property (readonly) UIView *view;

@end

Aber wenn ich das umsetze Gadget Protokoll in einer Unterklasse von AbstractGadget, etwa so:

// Concrete
@interface BlueGadget : AbstractGadget <Gadget> {
}

- (void) attachViewToParent:(UIView *)parentView;

@end


@implementation BlueGadget

- (void) attachViewToParent:(UIView *)parentView {
    //...
}

@end

Ich erhalte eine Compiler-Fehlermeldung mit der Meldung „Warnung:Für die Eigenschaft „view“ muss die Methode „-view“ definiert werden." Ich kann das verhindern, indem ich @dynamic, oder Hinzufügen einer Stub-Methode:

- (UIView *) view {
    return [super view];
}

Aber ich möchte nur wissen, ob ich etwas tue, das nicht unterstützt wird, etwas, das ich nicht tun sollte, oder ob es sich nur um eine Einschränkung/einen Fehler im Compiler handelt?

War es hilfreich?

Lösung

Indem Sie die Eigenschaft als @dynamic deklarieren, teilen Sie dem Compiler mit, dass der Eigenschafts-Getter (und ggf. Setter) an anderer Stelle (möglicherweise zur Laufzeit) implementiert werden.Das klingt für mich nach einem völlig vernünftigen Anwendungsfall.

Sehen Die Dokumente für mehr Informationen.

Andere Tipps

Ich bin auch auf genau dieses Problem gestoßen.Dies ist eine der Situationen, für die @dynamic da ist.

Hier ist die Regel für Variable, Eigenschaft und Synthese in Objective-C:

Wenn Sie eine Eigenschaft haben, müssen Sie über @synthesize verfügen oder Sie deklarieren @dynamic und schreiben die Getter- und Setter-Methode selbst.

Da Sie also eine Eigenschaft namens view haben, müssen Sie @synthesize deklarieren.Das sollte es sein.Nichts mit @protocol, Vererbung zu tun

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top