问题标签 [unowned-references]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
swift - Swift - 捕获列表自我澄清
在阅读了一些苹果的文章和开发者指南之后,我仍然对关闭捕获列表感到困惑。“捕获”是什么意思,在无主自我和弱自我方面如何在幕后工作?闭包如何在不拥有对象的情况下使用 self?我认为它就像制作该对象的副本,所以当它完成时,它会像值类型一样从堆栈传递,但我想我错了。我希望这里的某人可以使它更容易理解,或者将我链接到回答这个特定问题的好文章。感谢提前
swift - ARC 是否对无主引用进行计数?
ARC 是否保留对对象的无主引用计数?
那么,如果一个对象的强引用计数达到 0 并且该对象的无主引用计数 > 0,则该对象被取消初始化但没有被取消分配?只有当强引用计数和无主引用计数达到 0 时,它才会被解除分配?
我在一篇文章中读到过,我认为是在 Medium 上),但我不确定它是否正确。
swift - Unowned 引用如何与 Swift 中的捕获变量一起使用
ARC上有很多教程。但是我不明白 unowned 或 weak 的明确工作是如何引用捕获的变量变为空的。
苹果文档:
当闭包和它捕获的实例总是相互引用时,将闭包中的捕获定义为无主引用,并且总是同时被释放。
闭包在其主体内引用 self(作为引用 self.string 的一种方式),闭包捕获 self,这意味着它持有对 RetainCycle 实例的强引用。两者之间形成了一个强参考循环。通过无主它的中断引用循环。
但我想了解哪种情况不会同时相互解除分配,而 Unowned self 变为 null 只是想让它崩溃。?
swift - 当被呈现的视图“拥有”时,Swift 无主的自我泄漏
在据我所知,不应该泄漏的情况下,我正在经历与无主的自我泄漏。让我举个例子,这有点做作,所以请耐心等待,我已经尽力制作最简单的案例。
假设我有一个简单的视图控制器,它在 viewDidLoad 上执行一个闭包:
和一个类,ViewHandler,它拥有这个视图控制器的一个实例,并使用一个无主引用将一个通知函数的调用注入到它的闭包中:
然后,当它的视图控制器由另一个视图控制器呈现时,ViewHandler 在被取消时泄漏:
我知道这个例子可能看起来有点做作,但据我所知不应该有泄漏。让我尝试分解它:
在呈现 ViewHandler.ViewController2 之前,所有权应如下所示:
呈现 ViewHandler.ViewController2 后,所有权应如下所示:
取消 ViewHandler 后,所有权应如下所示:
没有任何东西拥有 ViewHandler,它应该被释放。然而,情况并非如此,ViewHandler 正在泄漏。
如果我将注入到 onDidLoad 的闭包的捕获列表中的引用更改为弱,则没有泄漏并且 ViewHandler 按预期释放:
另外,我无法解释的事情是,如果我将引用保持为无主并使 ViewHandler 从 NSObject 继承,ViewHandler 将按预期释放并且没有泄漏:
任何人都可以解释发生了什么?
swift - 深入了解 Swift 中的弱引用和无主引用
我想完全理解 Swift 中弱引用和无主引用的内容。为此,我阅读了MikeAsh并得到了一些问题。
已知的:
- 当没有弱(我想是unowned)对象引用时,强引用计数器直接存储在对象的内存区域中
- 当出现弱链接时,对象内存中的第二个单词被重用于引用边表
- 边桌有指向对象的链接
- 薄弱环节指的是这个边桌
我想澄清的是:
- 除了指向对象的链接和强引用的数量之外,还有什么边表存储在里面?
- 无主参考链接也指向边桌吗?如果不是,无主链接指的是对象内存,弱和无主之间的性能如何?
swift - Swift 弱引用比强引用慢得多
我正在用 Swift 构建一个物理引擎。在最近对引擎进行了一些添加并运行了基准测试之后,我注意到性能大大降低了。例如,在下面的屏幕截图中,您可以看到 FPS 如何从 60 FPS 下降到 3 FPS(FPS 在右下角)。最终,我将问题追溯到一行代码:
在我的补充中,我添加了一个从Shape
类到Body
类的弱引用。这是为了防止强引用循环,因为Body
也有强引用Shape
.
不幸的是,弱引用似乎有很大的开销(我想将它归零的额外步骤)。我决定通过构建下面的物理引擎的大规模简化版本并对不同的参考类型进行基准测试来进一步研究这一点。
结果
以下是每种参考类型的基准时间。在每次测试中,body
对类的引用都发生了Shape
变化。该代码是使用发布模式 [-O] 和面向 macOS 10.15 的 Swift 5.1 构建的。
weak var body: Body!
: 0.1886 秒
var body: Body!
: 0.0167 秒
unowned body: Body!
: 0.0942 秒
您可以看到在上面的计算中使用强引用而不是弱引用会导致性能提高 10 倍以上。使用unowned
帮助,但不幸的是它仍然慢了 5 倍。通过分析器运行代码时,似乎执行了额外的运行时检查,从而导致大量开销。
所以问题是,我有什么选择可以让一个简单的反向指针指向 Body 而不会产生这个 ARC 开销。此外,为什么这种开销看起来如此极端?我想我可以保持强参考周期并手动打破它。但我想知道是否有更好的选择?
更新:
根据答案,结果
unowned(unsafe) var body: Body!
如下:0.0160 s
Update2:
从 Swift 5.2 (Xcode 11.4) 开始,我注意到 unowned(unsafe) 的开销要大得多。这是现在的结果
unowned(unsafe) var body: Body!
:0.0804 s
注意:从 Xcode 12/Swift 5.3 开始仍然如此
ios - 为什么使用局部变量弱化强引用不起作用?
(我了解 ARC 的工作原理以及 和 之间的区别weak
。unowned
问题是关于它们的特定用途以及为什么它不起作用。unowned
为了简单起见,我将在下面的示例中使用。)
请参见下面的示例。注意第 10 行,它旨在将传递的强引用更改为无主引用。我认为这会起作用,但是当我最近在我的代码中使用它时,我发现我错了。
在 Playground 中运行上述代码。结果显示没有调用 deinit,表明对对象的强引用保存在字典中。
我想知道为什么?weak
和关键字是否unowned
仅适用于属性?但是上面的代码不会产生编译器错误,而且 Swift书确实提到它可以在变量声明中使用:
您可以通过在属性或变量声明之前放置 unowned 关键字来指示无主引用。
谁能分享一下你是怎么理解的?谢谢!
顺便说一句,我知道如何解决这个问题(例如,使用这样的包装器)。我试图理解的是为什么上面的代码不起作用。