【问题标题】:How to get a reference to the object that instantiated a second object in Objective-C?如何获取对在 Objective-C 中实例化第二个对象的对象的引用?
【发布时间】:2014-02-07 03:48:56
【问题描述】:

A 有一个对象 (secondObject),它是 NSObject 的子类的一个实例,并且在 secondObject 中,我想获得对实例化 secondObject 的对象 (firstObject) 的引用。

例子:

在 FirstObject.m(UIViewController 的子类)中

    SecondObject *secondObject = [[SecondObject alloc] init];

在 SecondObject.m 中

    @implementation SecondObject
    - (id) init {
        self = [super init];
        NSLog(@"Parent object is of class: %@", [self.parent class]);
    return self;
    }
    @end

我正在寻找类似于 viewControllers 的 .parentViewController 属性的东西

我一直在研究 KeyValueCoding,但一直没有找到解决方案。

我实现的解决方法是在 secondObject.m 中创建一个 initWithParent:(id)parent 方法,然后在实例化时传递 self。

在 SecondObject.m 中

    @interface SecondObject ()
    @property id parent;
    @end

    @implementation SecondObject
    - (id) initWithParent:(id)parent {
        self = [super init];
        self.parent = parent;
        NSLog(@"Parent object is of class: %@", [self.parent class]);
        return self;
    }

    @end

然后在fisrtObject.m中实例化对象如下

    SecondObject *secondObject = [[SecondObject alloc] initWithParent:self];

有没有更直接的方法?

Rgds....恩里克

【问题讨论】:

  • 你想出的是正确的方法。或者在调用init 之后设置属性。两者都可以。

标签: objective-c object parent kvc


【解决方案1】:

对象没有任何指向创建它的对象的指针。

您的 initWithParent: 方法会起作用,但您可能想考虑一下为什么您的对象需要了解它的创建者,以及是否没有更好的方法来完成您想要完成的任何事情。

此外,您可能希望将父属性设为弱属性,或者您最终会在各处创建保留循环。

【讨论】:

    【解决方案2】:

    init 方法中应该是_parent = parent;,但除此之外,这并没有太大问题。据我所知,做类似的事情实际上很常见(initWithDelegate: 等)

    不过……

    编写parent 类符合的@protocol 可能是明智之举,而不是只采用id,您需要一个符合协议的对象。

    【讨论】:

    • 这是正确答案。委托是一个非常重要的设计模式。你可以在这里阅读:developer.apple.com/library/ios/documentation/general/…
    • Thx nhgrif... 我在项目的不同部分实现了@protocols。我认为这是一个挑战,因为我想做的在概念上就像将 id 委托从父类移动到实例化类,以便访问委托 方法和属性。这是一个项目的一部分,该项目使用 CoreText(用于多个文章页面列)并包括使用捏合手势的动态字体大小,并且在单独的类分支中具有解析器和页面列构建器。
    猜你喜欢
    • 2013-11-10
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 2011-01-18
    • 2018-12-13
    • 1970-01-01
    相关资源
    最近更新 更多