可可/ Objective-C插件冲突

|| 我的应用程序具有一个插件系统,该系统允许我的用户编写自己的插件,这些插件在运行时加载。通常这很好,但是在某些情况下,两个插件使用相同的库,这将导致这两个插件之间发生冲突。 例: 插件A希望使用TouchJSON来处理JSON,因此创建者将TouchJSON代码添加到插件源中,并对其进行编译并链接到插件二进制文件中。后来,插件B也希望使用相同的库,并且功能完全相同。现在,当我的应用程序加载这两个不同的插件时,它会检测到并发出如下警告:   CJSONScanner类在以下位置实现   [path_to_plugin_a]和   [path_to_plugin_b]。两者之一   将会被使用。哪一个未定义。 由于我的应用程序仅加载插件并确保它们符合特定协议,因此我无法控制要加载的插件以及两个或多个插件使用同一个库。 只要两个插件都使用完全相同的库版本,这可能就会起作用,但是一旦一个插件中的API发生更改,就会出现很多问题。 有什么我可以做的吗?     
已邀请:
        捆绑软件加载系统没有办法和平解决名称冲突。实际上,我们被告知要确保自己不会发生问题,而不是如果问题发生了怎么办。 (显然,对于您而言,这是不可能的)。 您可以针对此问题提交错误报告。 如果这对于您的应用程序绝对重要,则可能需要将捆绑包放在单独的进程中,并使用某种IPC(可能为“ 0”)将数据从程序传递到插件主机。但是,我相当确定这是一个伤害,因此,如果您没有非常明确定义的接口允许将其分发到不同的进程中,则可能是一项艰巨的任务。     
        在单进程模型中,处理此问题的唯一方法是确保共享代码(更确切地说是共享的Objective-C类)被加载一次。有两种方法可以做到这一点: 将共享代码放在框架中。 将共享代码放入可加载的包中,如果相关的类尚不可用,则在加载插件时加载该包(使用
NSClassFromString()
进行检查)。客户端代码还必须使用“ 1”,而不是直接引用类。 当然,如果您无法控制插件,则无法实施这两种方案。您能做的最好的就是提供适当的指导原则并可能提供基础架构;例如,在第二种情况下,加载可由应用程序处理,如果插件的Info.plist中没有可用的包,则可以通过指定要检查的类以及要加载的嵌入式包的名称来处理。     

要回复问题请先登录注册