Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 访问cocoa中父类的对象_Macos_Cocoa_Class_Parent Child - Fatal编程技术网

Macos 访问cocoa中父类的对象

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;

我有一个主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
{
}
@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,它完全有意义!