Objective c 对象(包含NSMutableArray)在父/子类中具有不同的内容

Objective c 对象(包含NSMutableArray)在父/子类中具有不同的内容,objective-c,cocoa,class,inheritance,Objective C,Cocoa,Class,Inheritance,我有三门课:HopBill、HopBillController和HopBillSheetController。HopBill创建一个包含NSMutableArray的对象。出于测试目的,我已经在HopBill的init方法中向数组添加了一行。HopBill controller.h具有#导入“HopBill.h”,HopBill controller.m在其awakeFromNib方法中初始化对象:aHopBill=[[HopBill alloc]init]。到现在为止,一直都还不错。从HopB

我有三门课:HopBill、HopBillController和HopBillSheetController。HopBill创建一个包含NSMutableArray的对象。出于测试目的,我已经在HopBill的
init
方法中向数组添加了一行。HopBill controller.h具有
#导入“HopBill.h”
,HopBill controller.m在其
awakeFromNib
方法中初始化对象:
aHopBill=[[HopBill alloc]init]。到现在为止,一直都还不错。从HopBillController.m,我可以调用aHopBill对象的方法。它检索在init等上插入的行

HopBillSheetController是HopBillController的子级,基本上是按下按钮后弹出的一张表。在填写一些字段后,需要向aHopBill添加一行,然后关闭工作表。在HoppillSheetController中,我有:

#导入“HopBillController.h”

@接口HopBillSheetController:HopBillController{

我可以从HopBillSheetController.m中调用所有方法来检索在init上插入的行。所有方法看起来都很好。但是,当我填写工作表中的字段并按OK(以便向aHopBill添加行)时,HopBillSheetController调用HopBillController中的方法:
[super addHopAddition:[variation stringValue]]
。行被添加,但当我在Hopbill Controller.m中从aHopBill检索所有行时,它只返回插入到aHopBill的init上的行。当我从工作表中执行相同操作时,它返回插入到aHopBill的init上的行和我刚刚添加到工作表中的行


就好像我有两个aHopBill对象,但显然这需要一个对象。我做错了什么?

你把你的类层次结构和你的UI对象层次结构搞混了。从类继承与作为子窗口不是一回事

您的HopBillSheetController类当前继承自HopBillController。这意味着它实际上有自己的HopBillController实例作为其
super
。该实例与与与您的窗口关联的实例完全不同。正如您所发现的,对一个实例的更改不会影响另一个实例

这根本不是您想要的。您想要关联的是实际对象,而不是类结构。如何关联取决于整个设置的创建和结构,但可能归结为以下一个或其他选项:

  • 如果要在Interface Builder(或我们现在称之为Interface Builder的任何东西)中组合UI,则需要将适当的IBOutlet实例变量放入类中,并使用UI工具在它们之间建立连接

  • 如果要在代码中建立连接,则需要添加属性(或其他合适的访问器方法),以便一个类中的代码可以在另一个类中获取必要的对象实例


无论哪种方式,您都应该丢失这两个类之间的虚假继承。

我想我不知道系统是如何工作的:)谢谢,我将尝试属性部分。问题是最终我需要从MyDocument类(基于文档的应用程序)访问对象aHopBill。所以属性是我想的方向。再次感谢!我已经阅读了本页:并理解了简单变量。但我在这里处理一个对象。我该怎么做?@Joran原则是一样的。对象指针与任何其他值非常相似,你只需更加注意所有权。对于像这样的UI对象属性您可能希望声明为
retain
readonly
,尽管这并不是一成不变的。请阅读并准确思考您需要如何关联对象。也请阅读Objective-C文档的其余部分,特别是关于对象所有权和内存管理的内容。