【发布时间】:2010-05-04 17:25:46
【问题描述】:
我目前正在为我的应用程序编写插件框架。我希望能够在不必更新我的应用程序的情况下发布插件,并且我打算使该框架可用于第三方插件。当两个插件附带相同的框架时,我目前遇到了问题。加载插件时,运行时会感到困惑,因为框架被加载了两次。缓解此问题的最佳方法是什么?
【问题讨论】:
标签: objective-c cocoa plugins nsbundle
我目前正在为我的应用程序编写插件框架。我希望能够在不必更新我的应用程序的情况下发布插件,并且我打算使该框架可用于第三方插件。当两个插件附带相同的框架时,我目前遇到了问题。加载插件时,运行时会感到困惑,因为框架被加载了两次。缓解此问题的最佳方法是什么?
【问题讨论】:
标签: objective-c cocoa plugins nsbundle
有点不清楚你在问什么。你的意思是插件都包含你的框架,还是其他第三方框架?
如果它们都包含你的框架,那么你不应该那样做;他们应该引用嵌入在您的应用程序中的框架。您可以通过@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 命名空间冲突提供了几种解决方法。
【讨论】: