0

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

谢谢。

4

2 回答 2

1

首先,我假设您的子类定义为:

@interface Gfx : NSObject

NSObject问题中省略了,你也称它为Gfxand 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

这将为您提供静态(编译时)类型检查和点表示法。你也可以使用演员表,离开parentid可以使用:

((AppDelegate *)parent).myObject; // compiler will be happy

然而,这并不能检查它parent 是否引用了一个AppDelegate对象——强制转换是对编译器的“相信我”指令。因此使用强制转换绕过了静态类型检查,但仍会执行运行时检查。

高温高压

于 2013-09-09T23:25:11.863 回答
1

这里有几件事:

1)您可以通过此行轻松获取对应用程序委托的引用:

AppDelegate * appDelegate = [[NSApplication sharedApplication] delegate];

2)如果你想在孩子中存储对父母的引用,你可以这样做:

向您孩子的 .h @interface 文件添加一个属性,如下所示:

@property (retain) id parent;

然后,在您的父类中并在实例化您的子对象之后,您可以执行以下操作:

ChildObject * child = [[ChildObject alloc] init];
child.parent = self;

您可以通过以下方式从子级中引用父类:

self.parent;
于 2013-09-09T20:47:34.047 回答