Macos 访问cocoa中父类的对象
我有一个主AppDelegate类(MacOS开发,而不是iOS)用Macos 访问cocoa中父类的对象,macos,cocoa,class,parent-child,Macos,Cocoa,Class,Parent Child,我有一个主AppDelegate类(MacOS开发,而不是iOS)用 myChildClassObject=[[myChildClass alloc]init:self]; 因此,我确实将父引用发送到子类。 但是,如何从子类访问父类的对象? 我试过了 parent.myObject 但它没有找到它 我的父类定义如下: @interface AppDelegate : NSObject <NSApplicationDelegate> { NSView *myObject;
myChildClassObject=[[myChildClass alloc]init:self];
因此,我确实将父引用发送到子类。
但是,如何从子类访问父类的对象?
我试过了
parent.myObject
但它没有找到它
我的父类定义如下:
@interface AppDelegate : NSObject <NSApplicationDelegate>
{
NSView *myObject;
}
@property (nonatomic, readwrite, retain) NSView *myObject;
@end
@interface Gfx
{
}
@property (retain) id parent;
谢谢。这里有几件事: 1) 您可以通过以下行轻松获取对应用程序委托的引用:
AppDelegate * appDelegate = [[NSApplication sharedApplication] delegate];
2) 如果要在子对象中存储对父对象的引用,可以执行以下操作:
@interface AppDelegate : NSObject <NSApplicationDelegate>
{
NSView *myObject;
}
@property (nonatomic, readwrite, retain) NSView *myObject;
@end
@interface Gfx
{
}
@property (retain) id parent;
将属性添加到您孩子的.h@接口文件中,如下所示:
@interface AppDelegate : NSObject <NSApplicationDelegate>
{
NSView *myObject;
}
@property (nonatomic, readwrite, retain) NSView *myObject;
@end
@interface Gfx
{
}
@property (retain) id parent;
然后,在父类中,在实例化子对象之后,可以执行以下操作:
ChildObject * child = [[ChildObject alloc] init];
child.parent = self;
您可以通过以下方式从子类中引用父类:
self.parent;
首先,我假设您的子类定义为:
@interface Gfx : NSObject
(问题中省略了NSObject
,您也将其称为Gfx
和myChildClass
),即您的“孩子”不是“家长”的子类
您没有给出Gfx
init
方法的声明,因此我们猜测:
- (id) init:(id)parent
现在,访问属性的“点”语法依赖于保存对象引用的变量的静态类型,而不是引用对象的实际类型。因此,如果你有:
id parent; // instance variable
及
然后编译器将对象设置为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
,对调用不执行静态类型检查,方法仅在运行时动态找到。但是,这也引发了一个问题,如果父对象引用的对象没有myObject
/setMyObject
方法,该怎么办?您将在运行时得到一个错误
(b) 正确键入或转换父项。要键入,您需要将实例变量和init
声明更改为使用AppDelegate
,例如:
- (id) init:(AppDelegate *)parent
这将为您提供静态(编译时)类型检查和点表示法。您也可以使用强制转换,将父项保留为id,您可以使用:
((AppDelegate *)parent).myObject; // compiler will be happy
但是,这并不检查parent
is是否引用了AppDelegate
对象-强制转换是对编译器的“信任我”指令。因此,使用强制转换可以绕过静态类型检查,但运行时检查仍然会执行
HTH谢谢Michael,但是我仍然没有成功地完成我正在寻找的工作。我按照您的步骤操作,但仍然无法从子对象访问父对象:self.parent.myObject未被识别。。。我应该如何在父类中声明myObjet?感谢无法识别它的原因是因为您正在将“
parent
”保存为“id
”,这对于声明带有“void*
”的变量非常有用。应用程序不知道“父对象”
”到底是什么类型的对象。您需要将“self.parent
”强制转换到某个变量中,然后您应该能够检索“myObject
”属性。感谢CRD,它完全有意义!