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
我是 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