【问题标题】:What's better practice: objc_msgSendv or NSInvocation?什么是更好的做法:objc_msgSendv 或 NSInvocation?
【发布时间】:2023-03-17 04:52:01
【问题描述】:

所以我正在研究 obj-c 中的一些东西(我不想说什么),我需要能够在具有任意变量的任意对象上调用任意方法。前两个很容易做到,但我不确定如何做变量参数。需要明确的是,这不是关于接收变量参数的函数/方法,而是关于发送它们。我找到了两种方法来做到这一点:objective-c 运行时中的 objc_msgSendv(及其变体)和 NSInvocation。 NSInvocation 似乎更容易,更像是“最佳实践”,但 objc_msgSendv 听起来应该更快,而且我需要多次执行此操作,每次都使用完全不同的消息。我应该选择哪一个? objc_msgSendv 禁忌是有充分理由的吗? (文档说不要调用 objc_msgsend 函数。)

附:我知道所有参数的类型,并不是所有的都是id-s

另外,(不是主要问题的一部分,)似乎没有办法从 objc_msgSendv 向 super 发送消息,但在 NSInvocation 中似乎也没有办法做到这一点,所以任何帮助那也太好了。

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    objc_msgSendv 已弃用;在 64 位 Mac OS X 应用程序中完全不可用。所以,无论如何,不​​要使用它。

    真正的问题是您是否知道在编译时设置的参数。如果是这样,请使用objc_msgSend(或适当的变体)。

    如果不是,那么您将不得不使用某种机制将参数编码为符合特定目标体系结构的 C ABI 的调用。 NSInvocation 是这样做的最简单方法,但您是正确的,因为存在开销。

    您可以下拉至libffi 以提高效率,但与让编译器编译一些代码相比,构建您自己的调用仍然需要大量开销。

    如果你有有限的参数和返回类型组合,你可以编译一堆蹦床函数并使用它们。

    实际上,真正的问题是“你想做什么?”你所描述的是相当不典型的。并不是说你可能没有一个很好的理由,只是无论它是什么都很有趣(对我来说,无论如何)!

    【讨论】:

    • 谢谢,我不知道 obj_msgSendv 已贬值。我所做的有点做作,但基本上我有点生气,因为我不能在 iPad 上编码。因此,我正在考虑以某种方式为 obj-c 的子集编写解释器,因此即使我没有在应用商店上发布,我在技术上也没有违反 Apple 的任何限制。我什至只是在考虑这一点,因为objective-c 运行时是如此动态(例如,我可以只用字符串等调用cocoa/uikit)。哦,我从来没有注册过 SDK,所以我不能接受 NDA ;)
    • 啊……好的。然后,ffi 在 iPhone 平台上不可用。 iPad 处于 NDA 之下;不能在这里讨论。听起来是个有趣的项目。祝你好运。顺便说一句,您可能想看看 F-Script Anywhere。
    【解决方案2】:

    提防过早的优化。我将从更高级别的功能(NSInvocation)开始,因为它更容易进行单元测试、编码和调试。然后进行测量。仅当您的测量显示在 NSInvocations 中和周围花费大量时间(例如准备它们)时,才移动到较低级别的功能 (objc_msgSendv)。否则,即使 objc_msgSendv 更快,您也不会获得明显的好处,代价是代码更难维护。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      相关资源
      最近更新 更多