协议没有看到父类'ivar
的合成属性我有一种情况,我的子类没有看到超类的实例变量x
。伊娃显然是默认@protected
,所以为什么我会得到一个编译器错误“x undeclared”?协议没有看到父类'ivar
- (CGSize)hitSize
{
// Compiler error
return size;
}
编辑:hitSize是我的子类符合协议的属性。问题是我已经打到尺寸为@synthesize
d,这是罪魁祸首。那么问题是为什么综合得分手不能看到伊娃?
编辑:现在,我发现了这个问题,我编辑了问题,问为什么这是一个错误。
Joanna的答案都是正确的(虽然伊娃合成不踢上32位Mac OS X)。
原因是,因为允许子类综合访问超类的内部状态将会明显地破坏封装。在所有情况下,即使在单一框架内,都做出了明确不允许该特定模式的决定。
如果超类为某些东西提供存储,它应该提供访问控制并封装所述内存的管理。如果一个子类需要定制访问权限,可以通过重写getter/setter [并且最好调用super来实际获取/设置值]来小心执行。
合成属性不仅合成了吸气剂和吸气剂,还合成了伊娃如果没有声明。
您需要在子类中编写显式访问器,并通过self> myIvar语法访问@保护的ivar。
我建议不要这种模式,只是因为在super和subclass中有相同名字的iVars会令人困惑! – bbum 2010-06-03 07:06:25
您也可以使用显式的getter/setter属性来访问,即使基类的@private高德:
@interface Base : NSObject { @protected int intVar; } @end @interface Derived : Base { } @property (assign, getter = intVar, setter = intVar) int aVar; @end
非常感谢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
也许有一个旧的对象文件的地方?清理和重建问题是否会消失? – 2010-06-03 05:05:51
不,清洁和构建没有帮助。 – Morrowless 2010-06-03 05:06:56
向我们展示一些代码? – 2010-06-03 05:09:34