【问题标题】:Which object called another object's method in Obj-CObj-C中哪个对象调用了另一个对象的方法
【发布时间】:2011-02-08 23:46:29
【问题描述】:

我希望在 Cocoa 中编写一个插件控制器来加载包,并公开一组特定的方法供插件调用。

我的问题是:是否有可能知道有关在控制器中调用方法的对象的(任何)信息。当实例化插件在我的插件控制器中调用方法时,我想知道哪个插件实例调用了该方法,而不必依赖插件将指向自身的指针作为参数发送(我总是可以验证它们发送的指针,但我希望 API 方法尽可能简单)。

可能没有完美的解决方案(并且有简单的解决方法),但如果可能(或不可能的原因)学习一些新技巧总是好的。

提前致谢。

【问题讨论】:

    标签: objective-c cocoa methods


    【解决方案1】:

    不走堆栈是不可能的,甚至可能也不可能。甚至不能保证给定消息是从方法中发送的——即使是,它也可能不是您认为的“调用者”方法。例如,假设您的插件可以访问 Cocoa,您的控制器方法可以由 NSTimer 调用。

    一般来说,这是不切实际的。实现这一点的正常方法是让对象自己传递。如果您出于安全原因尝试这样做,那么无论如何您都需要一个更强大的解决方案,因为 Cocoa 的对象模型在设计时并未考虑到这一点。对象太容易谎报自己是谁和是什么。

    【讨论】:

    • 谢谢,我假设了这么多,但只是想确保我没有错过任何技巧。我想我会简单地要求插件发送自我。对于其他研究相同的人,我使用以下内容作为初始概念指南:panic.com/coda/developer/howto/plugins.php
    【解决方案2】:

    好吧,你可以抛出一个异常,捕获它并检查它的堆栈跟踪。

    当然,假设 Objective-C 支持异常。

    【讨论】:

      【解决方案3】:

      发送对调用对象的引用通常是这样做的。作为替代方案,您可以让您的主机代码为插件提供一个代理对象。加载每个插件后,为每个插件创建一个新的代理对象。

      【讨论】:

        猜你喜欢
        • 2020-05-30
        • 1970-01-01
        • 2015-06-16
        • 2022-12-09
        • 2013-08-16
        • 2016-11-04
        • 1970-01-01
        • 1970-01-01
        • 2012-10-04
        相关资源
        最近更新 更多