我有两个类:几何和圆。 Circle是Geometry的子类。
几何具有合成属性:
接口:
@interface Geometry : NSObject <drawProtocol, intersectionProtocol>
@property int geoLineWidth;
实现:
@synthesize geoLineWidth;
Circle是Geometry的子类。界面:
@interface Circle : Geometry
此代码在Geometry.m
中的Geometry方法中编译NSLog(@"%d", geoLineWidth);
此代码无法在Circle
的方法中编译NSBezierPath * thePath= [NSBezierPath bezierPath];
[thePath setLineWidth: geoLineWidth];
Use of undeclared identifier 'geoLineWidth'
但是,此代码编译:
[thePath setLineWidth: [self geoLineWidth]];
这种行为是故意的,还是我遗失了什么?
答案 0 :(得分:3)
这是故意的。您的子类只知道接口文件的内容(这是您导入的所有内容,不是吗?),并且您拥有的只是属性声明。这使编译器没有理由相信存在一个名为GeoLineWidth的实例变量。
答案 1 :(得分:1)
在子类中,您必须实际使用访问器,而不是直接访问实例变量。
改变这个:
[thePath setLineWidth: GeoLineWidth];
对此:
[thePath setLineWidth: self.GeoLineWidth];
[thePath setLineWidth: [self GeoLineWidth]];
要让编译器识别实例变量,您需要显式地在超类头文件中声明它。
答案 2 :(得分:1)
A)不要对变量使用大写,看起来像是一个类......
B)如果Ivar是公共的或受保护的,则子类可以使用self-&gt; Ivar访问。
C)因为你有属性,所以使用它们,一切都会成功。