提问人:Adil Hussain 提问时间:9/6/2023 最后编辑:Adil Hussain 更新时间:9/8/2023 访问量:288
为什么 Apple 不鼓励在框架标头中使用“@import”?
Why does Apple discourage the use of '@import' in framework headers?
问:
我有一个框架目标,其中包含 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 构建错误和文章都没有解释为什么我们应该避免在框架的公共和私有头文件中进行语义导入。
为什么我们应该避免在框架的公共和私有头文件中进行语义导入?
答:
Apple 在 Xcode 11.4 的发行说明中陈述的原因是“不鼓励在框架头中使用 @import,因为这样做需要所有导入器使用模块。"
换句话说,使用它会强制建立依赖关系,而不是普通语句,在普通语句中,预处理器仅包含另一个文件的必要方面。import
以下是 Apple 不鼓励使用它的几个原因:
较慢的编译时间:在框架标头中使用 @import 时,可能会导致编译时间变慢,尤其是在大型代码库中。@import生成的模块接口包含大量不必要的信息,编译器必须全部处理。这可能会减慢生成过程。
增加耦合:使用@import可以在模块之间创建紧密耦合。使用头文件中的 @import导入框架时,会向客户端代码公开框架的所有实现详细信息。这可能会导致意外的依赖关系,并使维护和改进代码库变得更加困难。
代码隔离的困难:框架应该为其客户端提供一个清晰、隔离的 API。使用 @import 可能会泄露实现细节并公开应保持私有的符号。当您希望在不破坏客户端代码的情况下对框架的内部进行更改时,这可能会导致问题。
评论