首先,我假设您的子类定义为:
@interface Gfx : NSObject
(NSObject
问题中省略了,你也称它为Gfx
and myChildClass
)即你的“孩子”不是你的“父母”的子类。
你没有给出Gfx
init
方法的声明,所以我们猜测:
- (id) init:(id)parent
现在,用于访问属性的“点”语法依赖于保存对象引用的变量的静态类型,而不是引用对象的实际类型。因此,如果您有:
id parent; // instance variable
和
parent.myObject
然后编译器将对象视为id
没有属性myObject
。两种解决方案:
(a) 直接调用 setter/getter 方法,例如:
[parent myObject]; // get the value of the property
[parent setMyObject:e]; // set the value of the property to e
这是因为编译器会id
特别对待并且不对调用执行静态类型检查,这些方法仅在运行时动态发现。但是这也带来了一个问题,如果引用的对象parent
没有myObject
/setMyObject
方法怎么办?您将在运行时收到错误消息。
(b)parent
正确键入或转换。要键入,您将更改init
要使用的实例变量和声明AppDelegate
,例如:
- (id) init:(AppDelegate *)parent
这将为您提供静态(编译时)类型检查和点表示法。你也可以使用演员表,离开parent
你id
可以使用:
((AppDelegate *)parent).myObject; // compiler will be happy
然而,这并不能检查它parent
是否引用了一个AppDelegate
对象——强制转换是对编译器的“相信我”指令。因此使用强制转换绕过了静态类型检查,但仍会执行运行时检查。
高温高压