我目前正在为我的应用程序编写一个插件框架。我希望能够在不必更新我的应用程序的情况下发布插件,并且我打算使该框架可用于第三方插件。当两个插件附带相同的框架时,我目前遇到了问题。加载插件时,运行时会感到困惑,因为框架被加载了两次。缓解此问题的最佳方法是什么?
问问题
168 次
1 回答
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 运行时没有命名空间,当您加载多个具有相同名称的类时,您不能期望任何理智的响应。这在这个问题中进行了讨论,它为 ObjC 命名空间冲突提供了几种解决方法。
于 2010-05-04T17:47:46.427 回答