在cocoa插件中重复冲突的框架

时间:2010-05-04 17:25:46

标签: objective-c cocoa plugins nsbundle

我目前正在为我的应用程序编写一个插件框架。我希望能够在不更新我的应用程序的情况下发布插件,并且我打算使框架可用于第三方插件。当两个插件附带相同的框架时,我目前遇到问题。当加载插件时,运行时会变得混乱,因为框架被加载两次。缓解此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

有点不清楚你在问什么。你的意思是插件都包含你的框架或其他第三方框架吗?

如果它们都包含您的框架,那么您不应该这样做;他们应该引用您的应用程序中嵌入的框架。您可以通过@executable_path引用框架包,因此它与您的应用程序相关(例如@executable_path/../Frameworks/MyFramework.framework/)。

以下是Lightroom的一个例子:

% otool -L Applications/Adobe\ Lightroom\ 2.app/Contents/PlugIns/Web.lrmodule/Contents/MacOS/Web
Applications/Adobe Lightroom 2.app/Contents/PlugIns/Web.lrmodule/Contents/MacOS/Web:
    /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 12.0.0)
    /System/Library/Frameworks/Carbon.framework/Versions/A/Carbon (compatibility version 2.0.0, current version 136.0.0)
    @executable_path/../Frameworks/AgSubstrate.framework/Versions/A/AgSubstrate (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)

如果它们都包含其他第三方Objective-C框架,那么这就是插件中的错误; Objective-C运行时没有名称空间,当您加载多个具有相同名称的类时,您不能指望任何合理的响应。这在this question中讨论,它为ObjC命名空间冲突提供了几种解决方法。