0

Ich habe den folgenden Code, der den Compiler-Fehler "Instance Variable '_someBool' is prive" gibt.Synthesized iVar nicht zugänglich von Unterklasse

@interface Foo: NSObject 
@property (assign) BOOL someBool; 
@end 
@implementation Foo 
@end 

@interface Bar: Foo 
@end 
@implementation Bar 
- (BOOL)someBool { 
    // subclass specific getter logic 
    return _someBool; 
} 
@end 

Warum kann ich nicht auf den Speicher der geerbten Eigenschaft zugreifen? Und was wäre der richtige Weg, diesen Getter zu überschreiben?

Antwort

1

Ein Getter ist nur eine Methode, wenn Sie eine Methode außer Kraft setzen wollen, und rufen Sie seine ursprüngliche Implementierung Sie verwenden super:

- (BOOL)someBool 
{ 
    // subclass specific getter logic 
    return [super someBool]; 
} 

Warum kann ich nicht auf die Speicherung der Eigenschaft, die vererbt wurde ?

Es ist privat. Wenn Sie wirklich auf den Speicher von einer Unterklasse zugreifen möchten, dann geben Sie Ihren eigenen Speicher an, indem Sie eine @protected Instanzvariable deklarieren und @synthesise property=variable verwenden. Mit super ist wahrscheinlich besser.

+0

In meinem Fall ist die Superklasse eine "abstrakte Schnittstelle", die in allen Methodenimplementierungen Assertionen auslöst. Das kann ich nicht ändern. ging mit override Setter/Getter in Unterklasse und Hinzufügen eines iVar dort. Eigenschaft noch in Super definiert. –

+0

@AlexBollbach - Wenn die Eigenschaften "Getter" und "Setter" in der übergeordneten Klasse "abstract" definiert wurden, um Assertions zu werfen, wird keine automatisch zugewiesene Backing-Variable zugewiesen, sodass Sie keinen Speicherplatz verlieren. Das Hinzufügen Ihres eigenen iVar ist der richtige Weg. – CRD

+0

nur die Getter sind in den Super übergangen worden. –