Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory management ';无主(安全)和#x27;和';无主(不安全)和#x27;?_Memory Management_Swift_Automatic Ref Counting - Fatal编程技术网

Memory management ';无主(安全)和#x27;和';无主(不安全)和#x27;?

Memory management ';无主(安全)和#x27;和';无主(不安全)和#x27;?,memory-management,swift,automatic-ref-counting,Memory Management,Swift,Automatic Ref Counting,苹果提到了捕获说明符无主(安全)和无主(不安全),此外还有弱和无主 我(想我)理解弱和无主之间的区别;但是无主(安全)和无主(不安全)之间有什么区别呢?导游没有说 请:不要依赖于简单地陈述Objective-C等价物。据我所知,尽管我无法从苹果找到确切的来源,无主可以分为两种类型,安全和不安全 裸unowned是unowned(safe):它是一个特殊包装的引用,在引用解除分配的实例时会引发异常 特殊情况是无主(不安全):它是目标C的@属性(分配)或\uuuunsafe\uunretained

苹果提到了捕获说明符
无主(安全)
无主(不安全)
,此外还有
无主

我(想我)理解
无主
之间的区别;但是
无主(安全)
无主(不安全)
之间有什么区别呢?导游没有说



请:不要依赖于简单地陈述Objective-C等价物。

据我所知,尽管我无法从苹果找到确切的来源,
无主
可以分为两种类型,
安全
不安全

unowned
unowned(safe)
:它是一个特殊包装的引用,在引用解除分配的实例时会引发异常

特殊情况是
无主(不安全)
:它是目标C的
@属性(分配)
\uuuunsafe\uunretained
的Swift等价物。它不应该在Swift程序中使用,因为它的目的是连接到用Objective C编写的代码

因此,在查看Cocoa类的导入包装器时,您将看到
无主(不安全)
,但除非必须使用,否则不要使用它,并且您将知道何时必须使用它


更新

\uuuu unsafe\u unrepaired
是一个简单的指针。它不知道被指向的实例何时被解除分配,因此当它被解除引用时,底层内存可能是垃圾

如果您有一个缺陷,其中使用了解除分配的
\uuuuuuuuunsafe\uunrepaired
变量,您将看到不稳定的行为。有时,该内存位置足够好,因此代码将运行;有时,它将被部分覆盖,因此会出现非常奇怪的崩溃;有时,该内存位置将包含一个新对象,因此会出现无法识别的选择器异常

\uuuuu unsafe\u unrepaired
指定一个引用,该引用不会使被引用对象保持活动状态,并且在没有对该对象的强引用时不会设置为nil。如果它引用的对象被解除分配,指针将悬空

以下是一段引自:

unowned
vs
unowned(安全)
vs
unowned(不安全)
unowned(safe)
是一个非所有权引用,在访问时断言 这个物体还活着。它有点像一个弱的可选参考 这是隐式展开的
x每次访问它时。
无主(不安全)
就像
\uuuuuunsafe\uunretained
在ARC中,它是一个无主 引用,但没有运行时检查对象是否仍处于活动状态 访问时,所以悬挂的引用将到达垃圾内存。
unowned
当前始终是
unowned(safe)
的同义词,但是 其目的是将其优化为
无主(不安全)
中的
-Ofast
禁用运行时检查时生成


一个简单的定义。这将消除混乱

--unowned attributes:如果在释放引用的实例后尝试访问unowned引用,则程序将崩溃


--无主(不安全)属性:如果在取消分配引用的实例后尝试访问不安全的无主引用,则程序将尝试访问该实例以前所在的内存位置,这是一个不安全的操作。(不保证这是否会执行或崩溃)

变量在已使用属性Dellocation时被访问:

无主
  • 程序知道它是无效的,并立即崩溃
  • 行为是有定义的
无主(不安全)
  • 程序一无所知
  • 它可能会立即崩溃
  • 它可能会访问未知的内存地址,并有奇怪的状态,直到它在意外的位置死亡
  • 行为未定义。生活变得越来越艰难

但是那些Objective-C等价物意味着什么呢?因此,总结一下,与
参考文献不同,
和所有
无主
参考文献都不会对参考文献计数产生影响。因此,一旦所有
strong
引用消失,引用的实例将被解除分配(当只有
无主
引用保留时)<代码>弱
引用将设置为
nil
(因此它们具有可选类型),而
无主
将不被设置。但是,
unowned(safe)
对已解除分配实例的引用在被访问时会引发可预测的异常,而
unowned(safe)
引用的行为就像一个简单的旧指针,行为不可预测。对吗?@Raxacoricoffallapatorius,不,那不对<代码>无主和
无主(安全)
确实会产生引用计数成本,这是安全成本,为什么还要让
无主(不安全)
以其他方式可用?-而且目前比常规强引用计数成本更糟糕,因为ARC没有为此进行优化。两者都没有例外;当错误使用时,它们会捕获,永久停止程序。