记忆管理 – Swift在“未知(安全)”和“未知(不安全)”之间有什么区别?

苹果公司的 Swift Programming Language Guide提到,除了软弱无力之外,这些捕获指标是不受保护的(安全的)和未知的(不安全的)。

我(认为我)了解弱者和不了解者之间的差异;但不知道(安全)和未知(不安全)之间有什么区别?指南没有说。

请:不要简单地说明一个Objective-C的等价物。

从我的理解,虽然我找不到苹果的最终来源,但不知道可以分为两种,安全和不安全。

一个裸体是未知的(安全的):它是一个特别包装的引用,当引用一个经过实例化的实例时,它将抛出一个异常。

特殊情况是未知的(不安全的):它是Swift等同于Objective C的@property(assign)或__unsafe_unretained。它不应该在Swift程序中使用,因为它的目的是桥接到Objective C中编写的代码

所以,当您查看Cocoa类的导入包装器时,您将看到uNowned(不安全),除非您必须使用它,否则不要使用它,并且您将知道何时必须。

更新

__unsafe_unretained是一个简单的指针。它不知道什么时候被指向的实例已经被处理,所以当它被取消引用时,底层内存可能是垃圾

如果您有一个缺陷,其中正在使用已经执行的__unsafe_unretained变量,那么您将看到不正常的行为。有时足够的内存位置足够好,所以代码将运行,有时它会被部分覆盖,所以你会得到非常奇怪的崩溃,有时内存位置将包含一个新的对象,所以你将得到无法识别的选择器异常。

Transitioning to ARC Release Notes

__unsafe_unretained specifies a reference that does not keep the referenced object alive and is not set to nil when there are no strong references to the object. If the object it references is deallocated,the pointer is left dangling.

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...