在Swift中为同一个变量使用weak和optional是多余的吗?

时间:2019-07-04 10:20:31

标签: ios swift

我是Swift的新人,在Apple docs中,我看到了:

  

在有效的引用在其生命周期中的某个时刻变为零时,请使用弱引用。

我不能仅通过使用“?”来实现吗?可选类型?

换句话说:

weak?是否重叠?

如果我没有在optional时将变量定义为weak,则编译器会抱怨,所以我觉得我可以删除它而忘却它,但是我感到误解它。

谢谢!

3 个答案:

答案 0 :(得分:5)

不,弱点和可选部分不相同,但是两者之间存在一些相互作用。

可选只是意味着可以通过自己分配nil或通过其他方式将其变为nil来成为SELECT @variable = variable ...变量。

nil关键字与内存管理有关。当变量不是 weak(即很强)时,表示ARC对分配的实例拥有强大的引用。因此,即使没有其他引用,该实例也将保留在内存中,因为该变量仍然“保留它”。

当变量为weak时,它没有对它的强引用。这意味着当没有其他强引用时,实例将被释放,并且变量将自动变为weak。这也解释了为什么弱变量必须是可选的。

您链接到的文档对此进行了非常清晰的解释。

答案 1 :(得分:1)

可选属性和非可选属性的不同之处在于,可选属性可以是nil,而非可选属性则不能。

weakstrong(默认情况下,属性为strong,没有weak关键字)属性的不同之处在于,weak不会增加属性的保留数,而strong做。如果weak属性未在其他位置强烈保留,则会将其释放。 weak属性也必须是可选的。

答案 2 :(得分:1)

weak 与内存管理有关,ARC应该从内存中删除该变量。如果变量弱,那么一旦对该内存的所有强引用被破坏,ARC将立即清除其指向的内存,并且当清除该内存时,即使变量是非可选的,它也将为零,因为其内存为已清除。

但是 optional 与内存无关,它与变量值直接相关,可以包含实际值也可以是nil。