“弱链接”框架是什么意思?

2024-06-28

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

这是否意味着框架仅在导入到某个地方时才包含在捆绑包中?

我想弱链接一些使用的调试框架私有API,并且我不希望它们出现在 App Store 版本中。


重要的提示: 这个答案是在 iOS 8 发布之前写的。虽然技术细节仍然适用于系统框架,但现在可以构建您自己的动态链接框架并在您的应用程序包中提供。有一些限制,例如,只有应用程序及其扩展可以链接到嵌入式框架的同一实例,但事实仍然是自定义的动态链接框架are自 iOS 8 起可能。如果您想了解更多信息,请参阅本指南 https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html (使用嵌入式框架共享代码)和 WWDC 2014 年第 416 场会议,构建现代框架.

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

某些框架可能无法在您想要支持的所有设备上使用,例如,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 中不是问题。

有关弱链接的更多信息:苹果文档 https://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WeakLinking.html

真正回答你的问题:

这是否意味着框架仅在导入到某个地方时才包含在捆绑包中?

No.该框架将始终从应用程序链接。仅当您的应用程序运行的实际设备上找不到该框架时,才不会加载该框架。

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

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

Edit:自 Xcode 5 以来的另一个选择是使用@import <FrameworkName>;。这样,您可以将“链接二进制...”阶段留空并触发代码中框架的链接。然后您可以使用宏,例如DEBUG确保某些框架不用于 App Store 构建。有一个很好的答案 https://stackoverflow.com/questions/18947516/import-vs-import-ios-7关于@import.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“弱链接”框架是什么意思? 的相关文章

  • Xcode 9:将静态框架链接到另一个静态框架

    本着 Xcode 9 的 革命性 功能 即编译静态框架 的精神 我们试图将子项目构建为静态框架 以便它们可以静态链接到主应用程序目标 我们的子项目之一本身具有静态框架依赖项 Firebase 当我们将子项目构建为动态框架时 一切正常 但是一
  • 在 Swift 中将 JSON 解析为 NSArray

    我有一个json数据 我可以将所有项目作为字符串或字典获取 但我无法将 付款 项目作为数组获取 我想从 付款 获取数据并转换 NSDictionary 我尝试了几种方法 但没有成功 这是我的 JSON 数据 last name aaa co
  • itunesconnect 在防火墙后面使用应用程序加载器

    我试图将我的应用程序的应用程序商店构建 zip 文件上传到应用程序商店 当在我的办公室防火墙后面使用时 TCP IP 连接失败 我需要知道应该打开哪个端口来使用应用程序加载器上传 iPhone 应用程序 这样端口就可以打开了 或者任何其他配
  • 无法在 Alamofire 4.0 中使用类型为“(String, withName: String)”的参数列表调用“append”

    我正在使用 Alamofire 4 0 在通过设备 相机选择或录制视频后将视频上传到服务器 但是当我尝试使用append调用上传函数时 在所有append语句中都出现了这个错误 我的代码有什么问题 第二个问题是我是否想在上传过程中显示进度以
  • 如何确定 C 代码是为 Android/NDK 还是 iOS 编译的

    我在 iOS 应用程序和 Android 应用程序中重用旧版 C 库 我想自定义一些宏定义 例如用于日志记录 是否有标准定义来检查 使用 ifdef 代码是否是针对 iOS 或 Android NDK 编译的 ANDROID or ANDR
  • CLLocationManager.requestLocation()大约需要10秒

    CLLocationManager requestLocation 大约需要 10 秒才能开火didUpdateLocations event 以下是设置的属性CLLocationManager let locationManager CL
  • 如何从 CVPixelBufferRef 转换为 openCV cv::Mat

    我想对一个执行一些操作CVPixelBufferRef并出来一个cv Mat 裁剪到感兴趣的区域 缩放到固定尺寸 均衡直方图 转换为灰度 每像素 8 位 CV 8UC1 我不确定最有效的顺序是什么 但是 我确实知道所有操作都可以在 open
  • 使用 xctool / xcodebuild 与 XCode Archive 的成功相比出现错误 ITMS-90046

    我有一个命令行脚本 用于编译 存档并将我的 ios 版本提交给 ITC 以进行 TestFlight 部署 它们工作得很好 但我最近在尝试在我的其他工作项目中使用嵌入式框架时遇到了一个问题 我的脚本成功编译并存档了项目 但由于嵌入的二进制冲
  • UIModalTransitionStyleFlipHorizo​​ntal 横向垂直翻转

    在横向模式下 从一个视图 导航控制器堆栈的一部分 转换到另一个视图作为模态视图 并将 UIModalTransitionStyleFlipHorizo ntal 设置为 modalTransitionStyle 视图在横向模式下垂直翻转 动
  • 在 App Store 上发布应用程序后,iAd 未在设备上显示

    检查了有关在 App Store 上发布应用程序后不显示 iAd 的几个问题 对 iAd 进行所有必要的设置 测试广告在模拟器和设备中显示良好 然后发布应用程序并为该应用程序启用 iAd 网络 在iAd Network部分 状态显示为 Li
  • 文件从 iOS 应用程序传输到 Mac 应用程序?

    是否可以在 Mac 应用程序和 iOS 应用程序之间传输文件 我想通过 Wifi 将 iOS 应用程序中的文档目录中的文件传输到 Mac 应用程序 我该怎么做 嗯 从 iOS 5 开始 就有了 iCloud 由于这仍处于保密协议之下 我只需
  • 在`../node_modules/react-native/React`中没有找到`React-Core`的podspec

    我正在使用 React Native 当我尝试上传 Pod 时遇到此问题 我已经成功安装了node modules 但遇到了这个问题 问题是什么 如果我们删除 package lock json 和 node modules 文件夹 我会重
  • 找不到与应用程序标识符匹配的有效配置文件

    之前已经问过这个问题 但是之前问题的答案并没有解决我的问题 我正在尝试构建一个简单的 Hello World 应用程序 名为 CalculatorBrain 来自斯坦福大学 iTunes U 课程 我可以在模拟器中很好地运行它 但我想在我的
  • 升级到 Xcode 3.2.5 后出现“Base SDK Missing”

    所以我采取了升级到 Xcode 3 2 5 iPhone SDK 4 2 的步骤 现在我无法运行到设备 我现在总是在开发环境中看到这一点 在我当前的项目中 当进入项目设置时 我只能将 Base SDK 设置为 iOS 4 2 但这并不能改变
  • 应用程序大小限制和查找应用程序的大小

    好吧 我读过无数地方说应用程序大小限制是 20 MB 有些说是 50 MB 是哪一个 更重要的是 我当前的应用程序在管理器的存档部分中的 估计应用程序商店大小 为 106 1mb 然而 当我将它分发到一个临时文件时 它会以 ipa 的形式出
  • 应用内购买仍在等待审核

    当我们开发新版本的应用程序时 我们提交了一些应用内购买的新版本 这些内容与旧版本相同 但属于消耗品 因此您可以多次购买 并且还支持折扣 它们被返回的原因是 请与二进制文件一起提交 因此 我们在上传新应用程序版本的二进制文件后再次提交了它们
  • 如果用户应答传入的 iMessage,WKWebView 会崩溃

    我的应用程序发生严重崩溃 CALayer position contains NaN 377 833 nan 具有以下堆栈 Fatal Exception CALayerInvalidGeometry 0 CoreFoundation 0x
  • 导航标题颜色更改问题

    当我弹出控制器时 我面临的导航标题颜色没有改变 请找到下面的代码 ProfilescreenVC swift override func viewWillAppear animated Bool super viewWillAppear a
  • ++ 已弃用,它将在 swift 3 中删除[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 将在 swift 3 中被弃用 变量 现在可以写成 variable 1 我怎样才能重写 variable 请回忆一下之间的区别 varia
  • 解析 Apple Mach O-Linker 错误?

    我正在使用解析框架 突然出现 39 个错误 即使我删除框架 它仍然有错误 我已经检查了构建阶段 设置和路径 但没有任何效果 另外 我正在使用 xcode 4 6 3 我有一台过时的 macbook Ld Users anikakablan

随机推荐

  • ORACLE 更新并返回 OLD 和 NEW 值

    PL SQL Oracle 12c 中是否有与此 T SQL 查询等效的内容 UPDATE A SET A columnA 10 WHERE A columnB lt 30 OUTPUT INSERTED DELETED 查询更新表A 同时
  • 有关基本 .htaccess mod_rewrite 的帮助

    我目前正在使用 php 解释子域通配符 我想使用 htaccess 处理它们 用户配置文件将在以下位置访问http 用户名 mysite com http username mysite com 或者对于某些人来说http www 用户名
  • 在 IE 中调试模式对话框 (showModalDialog)

    我想调试 检查 DOM 使用交互式 JS 控制台等 Web 应用程序的一部分 该应用程序位于由showModalDialog 我找不到使用标准 IE 8 开发人员工具的方法 该对话框没有工具栏 并且常用的快捷键 F12 不起作用 另一个SO
  • 有人可以离线编辑 javascript 文件来运行恶意代码吗?

    我担心与我网站的 javascript 文件相关的问题 我不确定这是否可行 当有人访问网站时会下载js文件 如果有人编辑下载的js脚本并插入自己的代码 然后刷新网站怎么办 在新的刷新中 网站将读取编辑后的 Js 文件并运行恶意代码 恶意代码
  • Dropbox 及其类似“文件夹”的设计

    我想知道从程序员的角度 最好是 C 或 Java 来看 在操作系统中操作文件夹来执行您想要的操作 例如像 FTP 一样 有多难 图片http www jacks log de wp content uploads 2011 02 Dropb
  • 将箭头添加到 SVG 描边动画

    我正在尝试获取包含 SVG 徽标的动画箭头 我使笔划动画正常工作 但我不确定如何使箭头位于该线的前面 我想要实现的一个例子是https stackoverflow com questions 45545887 how to animate
  • Linux 汇编调试器

    我需要一个在 Linux 上进行汇编的调试器 我对 Linux 上缺乏调试器感到非常惊讶 它应该具有各种功能 例如显示寄存器等等 我会使用 GDB 但它对 NASM 不太友好 我宁愿让调试器具有英特尔语法 但我可以做出牺牲 我尝试过 kdb
  • 如何检查 AngularJS 中是否指定了指令的方法参数?

    我创建了一个包含按钮的自定义指令 此按钮从 callback 属性指定的父范围调用方法
  • SQL 中的 Snowflake 脚本 - 如何迭代 SHOW 命令的结果?

    我正在查看新的 SQL Snowflake 脚本 预览版 但我不知道如何迭代SHOW命令 特别是当某些列是小写时 https docs snowflake com en developer guide snowflake scripting
  • Java安全框架

    在新项目中 安全性总是排在最后 或者您使用像 Spring 这样的框架 其中安全性已经内置并且可以轻松切换 我试图找到一个可以插入 Swing 和 Web 应用程序 以及 JavaFX 的开放安全框架 也许很容易理解 我研究了普通的 JAA
  • 多态查询的数据库压力

    我在 JPA 中使用了超过 5 个子类的多态抓取 执行的查询如下 explain SELECT ohlcrawbea0 trade time AS trade ti3 11 ohlcrawbea0 avg price AS avg pric
  • html5数据属性需要值吗? [复制]

    这个问题在这里已经有答案了 我想知道 html 数据属性是否真的需要应用一个值 我想知道这一点 因为通常我们想知道的是该属性是否实际上被设置为充当标志 当然我们可以为此使用一个类 但实际上 除非您打算以不同的方式设置这些项目的样式 否则标志
  • 为什么这个 CLLocationCooperative2D 变量不可分配?

    我有一个地理编码器方法 我希望它返回为我生成的 CLLocationCooperative2D CLLocationCoordinate2D geocode CLGeocoder geocoder CLGeocoder alloc init
  • 协作虚拟实例的 IP 范围?

    我想介绍一下我们公司的Google Colaboratory 然而 对于我们的大多数实验 我们需要访问使用白名单的 mongoDB 服务器 因此 我想知道 Colaboratory 使用的虚拟实例是否有我们可以使用的特定 IP 范围 否则
  • iPhone 到 Mac 开发

    我是一名 iPhone 开发人员 非常了解该框架 随着 Mac 应用商店即将推出 我想了解有关 Mac 开发的更多信息 有没有好的指南 教程 等等 帮助过渡 我环顾四周并没有发现太多 谢谢您的帮助 您基本上需要了解之间的区别UIKit an
  • Python shebang 线[重复]

    这个问题在这里已经有答案了 我见过有些人在 env 后面加上一个空格来写 shebang 行 例如 usr bin env python 这是拼写错误吗 我从来不使用空格 我用 usr bin env python 有人可以澄清一下吗 不
  • 对角画笔样式给我黑色区域

    我想用以下代码在画布上绘制一个对角线十字 InFlateRect r 1 1 Canvas Brush Color clYellow Canvas Brush Style bsFDiagonal Canvas Pen Color clRed
  • TypeScript TS7015:元素隐式具有“any”类型,因为索引表达式不是“number”类型

    我在 Angular 2 应用程序中收到此编译错误 TS7015 元素隐式具有 any 类型 因为索引表达式不是 number 类型 导致它的代码片段是 getApplicationCount state string return thi
  • 本地主机上的连接被拒绝

    我正在学校尝试使用我的 NodeJS 和 ReactJS 应用程序 但每次运行服务器时 都会出现错误localhost PORT net ERR CONNECTION REFUSED wifi 是否拒绝本地主机上的连接 PS 反应端渲染正确
  • “弱链接”框架是什么意思?

    在 Xcode 中 我可以将框架设置为 可选 而不是 必需 这意味着该框架是弱链接的 这是否意味着框架仅在导入到某个地方时才包含在捆绑包中 我想弱链接一些使用的调试框架私有API 并且我不希望它们出现在 App Store 版本中 重要的提