在cocoa中访问父类的对象

时间:2013-09-09 20:35:44

标签: macos cocoa class parent-child

我有一个主要的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
{
}

感谢。

2 个答案:

答案 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,您同时将其称为GfxmyChildClass)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