2010-06-03 23 views
1

的合成属性我有一种情况,我的子类没有看到超类的实例变量x。伊娃显然是默认@protected,所以为什么我会得到一个编译器错误“x undeclared”?协议没有看到父类'ivar

- (CGSize)hitSize 
{ 
    // Compiler error 
    return size; 
} 

编辑:hitSize是我的子类符合协议的属性。问题是我已经打到尺寸为@synthesized,这是罪魁祸首。那么问题是为什么综合得分手不能看到伊娃?

编辑:现在,我发现了这个问题,我编辑了问题,问为什么这是一个错误。

+0

也许有一个旧的对象文件的地方?清理和重建问题是否会消失? – 2010-06-03 05:05:51

+0

不,清洁和构建没有帮助。 – Morrowless 2010-06-03 05:06:56

+0

向我们展示一些代码? – 2010-06-03 05:09:34

回答

3

Joanna的答案都是正确的(虽然伊娃合成不踢上32位Mac OS X)。

原因是,因为允许子类综合访问超类的内部状态将会明显地破坏封装。在所有情况下,即使在单一框架内,都做出了明确不允许该特定模式的决定。

如果超类为某些东西提供存储,它应该提供访问控制并封装所述内存的管理。如果一个子类需要定制访问权限,可以通过重写getter/setter [并且最好调用super来实际获取/设置值]来小心执行。

1

合成属性不仅合成了吸气剂和吸气剂,还合成了伊娃如果没有声明。

您需要在子类中编写显式访问器,并通过self> myIvar语法访问@保护的ivar。

+0

我建议不要这种模式,只是因为在super和subclass中有相同名字的iVars会令人困惑! – bbum 2010-06-03 07:06:25

2

您也可以使用显式的getter/setter属性来访问,即使基类的@private高德:

 

@interface Base : NSObject 
{ 
    @protected 
    int intVar; 
} 

@end 

@interface Derived : Base 
{ 
} 

@property (assign, getter = intVar, setter = intVar) int aVar; 

@end 

1

非常感谢bbum对我的回复进行了详细说明。

关于你的第二个回复,你当然权利,在这种情况下,你可以在“做正确的事情”,使用类扩展到隐藏在基类中的属性,像这样:

 
// Example.h 
@interface Base : NSObject 
{ 
    @private 
    int intVar; 
} 

@end 

@interface Derived : Base 
{ 
} 

@property (assign) int aVar; 

@end 
 
// Example.m 
@interface Base() 

@property (assign) int intVar; 

@end 

@implementation Base 

@synthesize intVar; 

@end; 

@implementation Derived 

- (int) aVar 
{ 
    return self.intVar; 
} 

- (void) setAVar:(int)value 
{ 
    self.intVar = value; 
} 

@end 
相关问题