0

访问我有以下代码给出了编译器错误"Instance Variable '_someBool' is prive"合成iVar无法从子类

@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 

为什么我无法访问被继承的属性的存储?那么重写这个getter的正确方法是什么?

回答

1

吸气剂只是一种方法,如果你希望覆盖的方法,并调用其最初实现使用super

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

为什么我不能访问该属性的存储这是继承?

它是私人的。如果确实想要从子类访问存储,则通过声明@protected实例变量并使用@synthesise property=variable来指定您自己的存储。使用super可能会更好。

+0

在我的情况下,超类是在所有方法实现中抛出断言的“抽象接口”。不能改变这一点。在子类中重写setter/getter并在那里添加一个iVar。属性仍然定义在超级。 –

+0

@AlexBollbach - 如果属性getter和setter都在“abstract”超类中被定义为抛出断言,那么将不会有任何自动分配的后备变量,因此您不会“失去”空间。如你所做的那样添加你自己的iVar是一条路。 – CRD

+0

只有getters已经超越了super。 –