objective-c - 为什么不鼓励使用伞式框架?

我想分发框架 A。框架 A 依赖于框架 B。我希望我的框架的用户只需要包含框架 A,但仍然可以以编程方式访问框架 B。

Apple 一直使用“Umbrella Frameworks”的概念来做这件事,但是文档中有这个主题:

Don't Create Umbrella Frameworks

While it is possible to create umbrella frameworks using Xcode, doing so is unnecessary for most developers and is not recommended. Apple uses umbrella frameworks to mask some of the interdependencies between libraries in the operating system. In nearly all cases, you should be able to include your code in a single, standard framework bundle. Alternatively, if your code was sufficiently modular, you could create multiple frameworks, but in that case, the dependencies between modules would be minimal or nonexistent and should not warrant the creation of an umbrella for them.

为什么不鼓励这种方法?是什么让它成为 Apple 的框架相互依赖问题的一个很好的解决方案,但对我来说却不是?

最佳答案

仅当您是所有相关框架的唯一分发者时,伞形框架才有意义,并且您将把所有框架打包成一个版本化的包,然后一起升级。如果这是你的情况,那很好,但这是一个非常不寻常的情况。在 Cocoa 开发世界中,除了 Apple 以外的任何人都处于这种情况是非常不寻常的。

首先,伞式框架只有在您是给定框架的唯一分发者时才有意义。例如,假设您想将 libcurl 作为伞形框架的一部分。现在,其他一些打包者也希望将 libcurl 作为其伞形框架的一部分。现在我们有一个链接时冲突,它可能导致链接错误或更糟糕的未定义的运行时行为。我自己追过这些。他们非常不愉快。避免这种情况的唯一方法是每个框架/库只有一个版本。伞式框架鼓励相反的情况。

即使您只是将自己的代码分解为子部分,这也意味着其他供应商可能会在他们自己的伞形框架中使用您的子框架,从而导致同样的问题。请记住,如果您说作为第三方可以使用伞式框架,那么其他供应商也可以。

对于第二点,伞式框架只有在您控制所有子框架的版本控制时才有意义。根据我的经验,尝试修补一组相互依赖的框架几乎总是一场灾难。

由于系统的规模和普遍性,操作系统供应商遇到了不寻常的情况。在一个尺度上有意义的事情往往在另一个尺度上没有意义。 NSResponder 对此完全正确。当您提供一个完整的、数千个软件包环境时,权衡是不同的,这是为平台编写的每个程序的基础。但即使是 Apple 也只有少数几个大型伞式框架,而且它们总是围绕它们提供和控制版本的库进行包装。这主要是为了简化开发人员的工作,否则他们必须追逐数十个库和框架才能编译一些东西。没有第三方有这种情况,所以很少有第三方需要这个解决方案。要求您的客户链接两个库与要求他们链接 20 个库是完全不同的。如果您提供了 20 个可以协同工作并且您可以控制的框架,那么也许您应该使用保护伞,但也可能您有太多框架无法完成第三方。

我在这里的大部分讨论都是针对 OS X。在 iOS 上,这对第三方来说不是问题。由于肯定会发生冲突,静态库绝不能链接其他静态库。

理论上,我在这里讨论的大多数问题基本上都是链接器的技术限制。链接器没有管理多个版本库的好方法,因此冲突是一个严重的问题。 .NET 程序集试图为此提供更多的灵 active 。我对 .NET 开发不够熟悉,无法说出这是否成功。我对大型多组件系统的经验是,更简单、不太灵活的解决方案最适合大多数问题。 (不过,草总是更绿……)

https://stackoverflow.com/questions/7365578/

相关文章:

ios - scaledValueForValue : called on a font that

objective-c - 如何在 Objective-C 中命名常量?

c++ - UInt8 和 uint8_t 有什么区别

iphone - Objective-C 实现文件中方法名后的分号

objective-c - 在子类中覆盖初始化

objective-c - 使用 JSON (iOS) 的 Cocoa 错误 3840

ios - UIImagePickerController 相机 View 在 iOS 8 上奇怪地

objective-c - 调用 -retainCount 被认为是有害的

ios - 在从 UIViewController 调用的非保留完成中引用 self 时,weakS

objective-c - 处理由于 iOS 通讯录 API 中的链接卡导致的重复联系人