可可/目标C(OSX不是iOS)从子对象访问父对象

人气:224 发布:2022-10-16 标签: parent-child object cocoa objective-c macos

问题描述

我是StackOverflow的新手,也是ObjectiveC的新手。我做了很多研究,已经找到了一些答案,比如:Accessing objects of parent class in cocoa

尽管如此,我在理解它时仍有一些问题,我希望社区能够帮助理解:

我有一个视图控制器,在这个控制器中,我创建了一个自定义NSObject类的实例。我想从对象实例中访问视图控制器的(父)属性和方法。

MYCustomViewController.h

@interface MYCustomViewController : NSViewController

// Vars
@property BOOL testBool;

@end

MYCustomViewController.m

@implementation MYCustomViewController

- (void) someMethod
{
    self.testBool = true;
    _importController = [[MYCustomObject alloc] init];
    [_importController test];
}

@end

MYCustomObt.h

@interface MYCustomObject : NSObject
- (void)test;
@end

MyCustomObject.m

@implementation MYCustomObject

- (void)test
{
    // HOW CAN I ACHIEVE THIS?
    myParent.testBool; // --> true

    // AND THIS?
    [myParent someMethod];
}

@end

我还在学习,所以任何(不太简短)的解释都是很好的。 想法是:在物体瞬间发送"自我",但如何发送呢?

瞄准OSX 10.10、Xcode 8、OSX 10.12

编辑:在MYCustomObject上使用协议使其工作。上述想法还有其他可能吗?

推荐答案

Objective-C(和SWIFT)没有"父对象"是创建对象的对象的语言概念。(课堂上有一种家长/孩子的关系。)如果您的模型需要父连接,则只需将创建父连接传递给init方法。

例如,给定类MustHaveParent可以定义以下内容:

@implementation MustHaveParent
{
   id myParent; // reference to my parent
}

- (instancetype) initWithParent:(id)parent
{
   self = [super init];
   if(self)
      myParent = parent;
   return self;
}

可以使用以下命令创建此类的实例:

// myChild is a *local* variable, see below
MustHaveParent *myChild = [[MustHaveParent alloc] initWithParent:self];

如果您的模型确实需要这样的引用,则应注意不要创建引用循环,即父引用子引用而子引用父引用。这就是上面的例子使用局部变量的原因,如果引用存储在创建者的实例变量中,就会有一个循环。虽然并不总是坏的周期,但经常会导致内存泄漏。如果您需要了解更多有关这方面的信息,请查阅"引用周期"、"强引用"、"弱引用"等。

HTH

528