- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我了解 Swift 中 weak
和 unowned
的用法和表面差异:
我见过的最简单的例子是,如果有一个 Dog
和一个 Bone
,那么 Bone
可能有一个弱引用Dog
(反之亦然),因为它们可以彼此独立存在。
另一方面,对于Human
和Heart
,Heart
可能有一个unowned
code> 对人的引用,因为一旦 Human
变成...“取消引用”,就无法再合理地访问 Heart
。这与 Customer
和 CreditCard
的经典示例。
因此,这不是关于此问题的重复问题。
我的问题是,拥有两个如此相似的概念有什么意义?本质上 99% 相同的事物需要使用两个关键字的内部差异是什么?问题是为什么存在差异,而不是差异是什么。
鉴于我们可以像这样设置一个变量:weak var customer: Customer!
,unowned
变量是非可选的优势是一个有争议的问题。
The only practical advantage I can see of using
unowned
vs implicitly unwrapping aweak
variable via!
is that we can makeunowned
references constant vialet
.
...也许编译器可以因此做出更有效的优化。
这是真的吗,还是在幕后发生了其他事情,为保留这两个关键字提供了令人信服的论据(尽管细微的区别是——基于 Stack Overflow 流量——显然让新手和有经验的开发人员都感到困惑)。
我非常想听听从事 Swift 编译器(或其他编译器)工作的人们的意见。
最佳答案
My question is, what is the point in having two such similar concepts? What are the internal differences that necessitate having two keywords for what seem essentially 99% the same thing?
它们一点也不相似。它们尽可能地不同。
weak
是一个高度复杂的概念,在引入 ARC 时引入。它执行近乎奇迹般的任务,允许您防止保留循环(通过避免强引用),而不会在引用的对象不存在时因悬挂指针而崩溃——这在 ARC 之前一直发生介绍。
unowned
另一方面,是 non-ARC weak(具体来说,它与非 ARC assign
)。在引入 ARC 之前,它是我们过去不得不冒的风险,它是导致如此多崩溃的原因。这是非常危险的,因为如果引用的对象不存在,您可能得到悬空指针和崩溃。
差异的原因是weak
,为了创造它的奇迹,涉及很多额外的运行时开销,由编译器在幕后插入. weak
引用是内存管理的。特别是,运行时必须维护一个以这种方式标记的所有引用的暂存器,跟踪它们,以便如果弱引用的对象不存在,运行时可以找到该引用并将其替换为nil
以防止悬空指针。
因此,在 Swift 中,一个 weak
引用总是指向一个 Optional(正是这样它可以被 nil
替换)。这是额外的开销来源,因为使用 Optional 需要额外的工作,因为它必须始终被解包才能完成任何事情。
因此,unowned
在适用的情况下始终是首选。但除非绝对安全,否则切勿使用它!使用 unowned
,您将放弃自动内存管理和安全。你是在故意回到 ARC 之前的糟糕日子。
在我的使用中,常见的情况出现在闭包需要包含 self
的捕获列表 以避免保留循环的情况下。在这种情况下,几乎总是可以在捕获列表中说[unowned self]
。当我们这样做时:
这对程序员来说更方便,因为没有什么可以解包的。 [weak self]
将是一个需要解包才能使用的 Optional。
它更有效,部分原因是相同的(解包总是添加额外的间接级别),部分原因是它是运行时暂存器列表跟踪的一个较少的弱引用。
关于swift - Swift 中的 weak vs unowned。内部差异是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42842336/
我正在阅读为 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(),如果操作系
我是一名优秀的程序员,十分优秀!