Objective-C的功能调度碰撞; 或者说,如何实现“命名空间”?(Objective-C

2019-10-17 17:03发布

我对Mac OS X的支持是打算在同一时间被加载插件的应用程序。 一些这些插件都是建立在Cocoa框架可接收更新的一个插件,而不是另一个的上面。 由于Objective-C的电流功能的调度方法,从任何一个插件给定的Objective-C程序的任何呼叫将走同样的流程是每当时间。 这意味着一个插件可以发现自己插件B 的内部有一个简单的Objective-C的来电! 显然,我们正在寻找的是为每个插件与它自己的版本后,它是建框架的交互。 我 已经 被 阅读了一些关于Objective-C和这种特殊的需求,但还没有找到它最终的解决办法呢。

更新:我上面用的是“框架”的误导性:该框架是一个静态链接库,内置到需要它的插件(一个或多个)。 该方法Objective-C的手柄调度,然而,即便是这些的不同代码静态链接的作品将在Objective-C的调度员共同混合,导致意想不到的后果。

更新2:我还是对有点模糊这里所提供的答案 ,因为它似乎并没有尽可能多的提出解决方案作为一个未经证实的假说。

Answer 1:

你不能做到这一点(至少不平凡),Objective-C的目前还没有命名空间的概念,并且运行时只提出一个单一的(全球)调度表。

请注意,这不是唯一的Objective-C的,甚至是基于C的插件也可以相互之间相当平凡打电话,因为一切都在同一个地址空间。 诚然,如果你担心不小心这样做是不太可能的,因为两个级别的命名空间,但这些不会保护你,如果一些插件明确地试图进入另一个代码。

如果你真的想隔离插件可以创建这样您运行加载插件代码,让你的应用程序执行本身和辅助应用程序之间的RPC单独的辅助程序。 这是Safari浏览器也对雪豹64位,例如。 有许多的这种方法的好处,但它是相当复杂的实现,你必须滚大部分自己。



Answer 2:

我不认为我了解“插件中可以找到自己的插件B.内部”你对此有何评论 我猜你的意思是,一旦你已经加载了一些相关的框架一次,然后每个人都会使用它,而不是装载自己,这是正确的。 这是正确的,你是否有类似的命名空间或没有。

这是一个是否需要插件的OpenSSL的一个版本,你会面临同样的问题,而另一个插件所需的OpenSSL的另一个版本。 你不能加载这两个库提供相同的符号。

我理解这个问题? 各种插件需要相同的架构不同,不兼容的版本? 我的方法,如果可能的话,将是框架更改为静态库和静态你的插件链接到他们的框架。 如果你不共享插件之间的框架,那么一个框架真的不是你想要的。 你想只编译代码(静态链接)。 框架的全部意义在于分享。



Answer 3:

最好的解决方案迄今是从设想中提出的衍生这一问题



文章来源: Objective-C function dispatch collisions; Or, how to achieve “namespaces”?