我有一个主要的AppDelegate类(MacOS开发,而不是iOS)启动子类
myChildClassObject=[[myChildClass alloc]init:self];
所以我确实将父引用发送给子类。 但是,如何从子类中访问父类的对象? 我试过
parent.myObject
但它找不到它。
我的父类定义如下:
@interface AppDelegate : NSObject <NSApplicationDelegate>
{
NSView *myObject;
}
@property (nonatomic, readwrite, retain) NSView *myObject;
@end
我的子课程定义如下:
@interface Gfx
{
}
感谢。
答案 0 :(得分:1)
这里有几件事情:
1)您可以通过以下行轻松获得对应用程序代理的引用:
AppDelegate * appDelegate = [[NSApplication sharedApplication] delegate];
2)如果你想在孩子中存储对父母的引用,你可以这样做:
为您孩子的.h @interface文件添加一个属性,如下所示:
@property (retain) id parent;
然后,在您的父类中,在实例化您的子对象后,您可以执行以下操作:
ChildObject * child = [[ChildObject alloc] init];
child.parent = self;
您可以通过以下方式从孩子中引用父类:
self.parent;
答案 1 :(得分:1)
首先,我假设您的子类定义为:
@interface Gfx : NSObject
(问题中省略NSObject
,您同时将其称为Gfx
和myChildClass
)I.e。你的“孩子”不是你“父母”的子类。
您尚未提供Gfx
init
方法的声明,因此我们猜测:
- (id) init:(id)parent
现在,用于访问属性的“点”语法依赖于保存对象引用的变量的 static 类型,而不依赖于引用对象的实际类型。所以如果你有:
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
对象 - 转换是对编译器的“信任我”指令。因此,使用强制转换会绕过静态类型检查,但仍会执行运行时检查。
HTH