- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在 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 中内置的“将二进制文件与库链接”构建阶段,而是通过链接器选项链接调试框架。这些可以分别为每个配置(调试/发布/...)指定,如下所示:
如果你想对其进行弱链接,请使用 -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/
我正在阅读为 STM32 定义中断 vector 的代码 here .出于某种原因,同时使用了 __attribute__((weak)) 和 #pragma weak: void __attribu
Vala 中的弱引用和无主引用有什么区别。 根据我从 Vala 教程中学到的知识,弱引用和无主引用都不算在内,当真实实例超出范围时,它们将引用 null(!!)。 为什么出于一个原因应该有两种不同的方
正如我们所知,在 block 中使用 strong self 会导致循环保留和内存泄漏。通常的做法是在 block 中使用弱 self ,还是将弱 self 分配给 block 中的 strong s
所以我正在尝试对我用 swift 编写的代码进行一些润色和分析。我有一堆问题很详细,通过搜索弱引用和强引用等主题很难找到它们。 例如,我没有看到 XCode 提示下面用于 socket 的任何一行。如
为什么weak.lock()返回 nullptr在此代码片段中: std::weak_ptr weakPtr1 = std::make_shared(6); std::cout shar
创建了一个模板函数C++ template void myswap(T&d,T&s) 。Main 将其用于 int、double、complex 类型。使用 g++ 编译源代码。通过 nm 转储符号
什么时候不应该鼓励弱类型?大型项目中不鼓励使用弱类型吗?如果左侧像下面这样强烈键入,那将是该规则的例外吗? int i = 5 string sz = i sz = sz + "1"
在接下来的 0.5 秒延迟期间,tableViewManager 可能会被释放。我想确保在嵌套闭包内与 textView 交互时 textView 是弱的。我该怎么做? tableViewManage
动机 我有 2 个静态库,libStatic1.a 和 libStatic2.a。此外,我还有许多使用 libStatic1.a 编译的 SO(共享对象)。至此,libStatic1.a 和 libS
让我们调用一些函数,它有一个转义闭包作为参数: someFunc(complition: { self.someAnotherFunc() }) 相当于: someFunc(complitio
我想通过使用聚合来构建一个包含多个子对象的类TParent。有些对象是独立的,而有些对象也可能依赖于其他子对象。所有子对象都必须有对父对象的引用。我还想尽可能使用接口(interface)。 为此,我
我正在编写一个需要 SQL Server SMO 库的 .NET 工具。我不在乎它是来自 Server 2005 (9.0)、2008 (10.0) 还是 2008 R2(可能是 10.5,没有检查)
所以我最近一直在考虑一些自动内存管理的想法——特别是,我一直在考虑实现一个基于引用计数的内存管理器。当然,每个人都知道循环引用会扼杀幼稚的引用计数。解决方案:弱引用。就我个人而言,我讨厌以这种方式使用
我知道,在非引用类型数据上使用 weak 时,这会引发错误。但是,我在我自己创建的类上使用它。只是想知道是否有人遇到同样的问题。 internal static func registeruUser(
我有一个名为 Panel 的类,它包含这样一个弱属性: @property (nonatomic, weak) Dialog *container; 在 Instruments 中,我可以看到 set
这个问题与this post非常相似- 但不完全是 我在 .csv 文件中有一些数据。数据精确到第 4 位 (#.####)。 在 Excel 或 SAS 中计算平均值给出的结果精确到第 5 位 (#
我正在编写一个名为“MQTT_interface”的类。我需要在此类的“重新连接”方法中使用“回调”功能。我想开发人员会为自己编写函数“回调”,如果没有,将会有一种同名的弱函数(“回调”),它会向控制
在 Java 中,如果内存不足,弱引用将被垃圾回收。在 Linux 中,malloc() 总是返回一个强引用,即。在调用者调用 free() 函数之前,指针永远不会被释放。 我想分配一个缓冲区用于缓存
我可能对 weak 理解有误: 我的情况: 具有一些弱回调的“物理层” 实现这些回调的“框架层”,并为应用层提供新的 WEAK 回调 主要 - 应用层。 phy.h #pragma once void
我很想知道是否有一种方法可以在 Linux、OS X 或 Windows 等常见操作系统的用户空间中分配“弱”内存(标准接口(interface)显然不可能)。我的意思是那种 mmap(),如果操作系
我是一名优秀的程序员,十分优秀!