gpt4 book ai didi

ios - 框架 "weak-link"是什么意思?

转载 作者:IT王子 更新时间:2023-10-29 08:03:38 25 4
gpt4 key购买 nike

在 Xcode 中,我可以将框架设置为“可选”而不是“必需”,这意味着框架是弱链接的。

这是否意味着框架仅在导入某处时才包含在包中?

我想弱链接一些使用私有(private) API 的调试框架,我不希望它们出现在 App Store 构建中。

最佳答案

重要说明:这个答案是在 iOS 8 发布之前写的。虽然技术细节仍然适用于系统框架,但现在可以构建您自己的、动态链接的框架,并在您的应用程序包中发布。有一些限制,例如,只有一个应用程序及其扩展可以链接到嵌入式框架的同一实例,但事实仍然是自 iOS 8 以来自定义、动态链接的框架是可能的。如果你想了解更多,请参阅this guide (使用嵌入式框架共享代码)和 WWDC 2014 session 416,构建现代框架

原始答案:没有一个(平台)框架真正“包含在包中”。相反,一旦您将应用程序添加到“将二进制文件与库链接”构建阶段,您的应用程序就会有一个对框架的引用(“链接”)。这些框架已预先安装在设备上。当您运行应用时,应用的所有框架引用都由动态链接器(在设备上)解析,这意味着框架代码已加载,因此您的应用可以使用它。

某些框架可能无法在您打算支持的所有设备上使用,例如,PassKit 是在 iOS 6 中引入的。如果您在 iOS 5 设备上运行链接到 PassKit 的应用程序,它会在启动后立即崩溃,因为动态链接器无法在设备上找到框架。但是,如果您弱链接 PassKit,动态链接器会将所有框架的符号设置为 nil ,如果找不到框架。这可以防止应用程序崩溃,您可以在运行时检查符号的可用性,例如:

if ([PKPass class]) {
// Class is available - use it
PKPass *pass = [[PKPass alloc] init];
}

[PKPass class]PKPass 以来可在所有设备/系统上安全使用类符号将为 nil在旧系统和消息传递上 nil在 Objective-C 中不是问题。

有关弱链接的更多信息:Apple Documentation

真正回答你的问题:

Does that mean the framework is only included in the bundle when it is imported somewhere?

否。框架将始终从应用链接。只有在您的应用运行的实际设备上找不到该框架时,才会加载该框架。

一种解决方案是为调试和 App Store build设置单独的目标。另一种方法是不使用 Xcode 中内置的“将二进制文件与库链接”构建阶段,而是通过链接器选项链接调试框架。这些可以分别为每个配置(调试/发布/...)指定,如下所示:

Adding framework via linker flags

如果你想对其进行弱链接,请使用 -weak_framework PassKit (当然,PassKit 只是这里的一个示例……插入您的框架的名称)。如果您的调试框架不在默认框架目录之一中,您可能必须提供完整路径或修改框架搜索路径。另外,您可能应该使用宏来确保使用调试框架的代码都不会进入 App Store 构建。

编辑:自 Xcode 5 以来的另一个选择是使用 @import <FrameworkName>; .这样,您可以将“链接二进制...”阶段留空并触发代码中框架的链接。然后您可以使用宏,例如 DEBUG确保某些框架不用于 App Store 构建。有一个 excellent answer关于 @import .

关于ios - 框架 "weak-link"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16922013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com