为什么 Apple 不鼓励在框架标头中使用“@import”?

Why does Apple discourage the use of '@import' in framework headers?

提问人:Adil Hussain 提问时间:9/6/2023 最后编辑:Adil Hussain 更新时间:9/8/2023 访问量:288

问:

我有一个框架目标,其中包含 Objective-C 和 Swift 源文件的混合。

我刚刚将项目的构建设置升级到 Xcode 14.3.1 推荐的设置。

Xcode 所做的更改之一是打开框架目标的构建设置。ENABLE_MODULE_VERIFIER

升级后,我在包含语义导入(即表单导入)的框架的所有公共头文件中都收到以下构建错误:@import MODULE_NAME;

不建议在框架标头中使用“@import”,包括此标头需要 -fmodules

我在 Xcode > Build system > Identifying and addressing framework module issues 一文中看到了这个建议:

避免在公共和私有标头中使用语义导入语法。

Xcode 构建错误和文章都没有解释为什么我们应该避免在框架的公共和私有头文件中进行语义导入。

为什么我们应该避免在框架的公共和私有头文件中进行语义导入?

xcode 框架 ios-frameworks xcode14 xcode-build-settings

评论


答:

4赞 Ben A. 9/6/2023 #1

Apple 在 Xcode 11.4 的发行说明中陈述的原因是“不鼓励在框架头中使用 @import,因为这样做需要所有导入器使用模块。"

换句话说,使用它会强制建立依赖关系,而不是普通语句,在普通语句中,预处理器仅包含另一个文件的必要方面。import

0赞 Ajharudeen khan 9/8/2023 #2

以下是 Apple 不鼓励使用它的几个原因:

较慢的编译时间:在框架标头中使用 @import 时,可能会导致编译时间变慢,尤其是在大型代码库中。@import生成的模块接口包含大量不必要的信息,编译器必须全部处理。这可能会减慢生成过程。

增加耦合:使用@import可以在模块之间创建紧密耦合。使用头文件中的 @import导入框架时,会向客户端代码公开框架的所有实现详细信息。这可能会导致意外的依赖关系,并使维护和改进代码库变得更加困难。

代码隔离的困难:框架应该为其客户端提供一个清晰、隔离的 API。使用 @import 可能会泄露实现细节并公开应保持私有的符号。当您希望在不破坏客户端代码的情况下对框架的内部进行更改时,这可能会导致问题。

评论

2赞 Adil Hussain 9/8/2023
请引用您的声明的来源,即使用框架内标头导入会导致编译时间变慢、耦合增加和代码隔离🙏困难 我对模块(即模块接口和模块导入)的理解是 (1) 它可以利用传统文件导入所不具备的编译时优化;(2)它允许隐藏私人标题,就像传统的伞形标题一样。@import
3赞 Community 9/11/2023
您的答案可以通过额外的支持信息得到改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。