Cocoa/Objective C (OSX NOT IOS) 从子访问父对象

Cocoa/Objective C (OSX NOT IOS) accessing parent Object from child

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

还是有点理解上的问题,希望大家帮忙理解:

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

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

MYCustomObject.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

我还在学习,所以任何(不要太短)解释都很好。 想法是:在对象实例化时发送 "self",但如何发送?

目标 OSX 10.10,Xcode 8,OSX 10.12

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

Objective-C(和Swift)没有语言概念"parent object"是创建对象的对象。 (在 classes 中有一个 parent/child 关系。)如果您的模型需要一个父连接,那么您只需将创建父连接传递给一个 init 方法。

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

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

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

并且此 class 的一个实例可以使用以下方法创建:

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

如果您的模型确实需要这样的引用,您应该注意不要创建引用循环,即父项引用子项而子项引用父项。这就是为什么上面的例子使用局部变量,如果引用存储在创建者的实例变量中,就会有一个循环。虽然并不总是坏循环,但通常会导致内存泄漏。如果您需要了解更多信息,请查找 "reference cycles"、"strong references"、"weak references" 等

HTH