我是Swift的新人,在Apple docs中,我看到了:
在有效的引用在其生命周期中的某个时刻变为零时,请使用弱引用。
我不能仅通过使用“?”来实现吗?可选类型?
换句话说:
weak
和?
是否重叠?
如果我没有在optional
时将变量定义为weak
,则编译器会抱怨,所以我觉得我可以删除它而忘却它,但是我感到误解它。
谢谢!
答案 0 :(得分:5)
不,弱点和可选部分不相同,但是两者之间存在一些相互作用。
可选只是意味着可以通过自己分配nil或通过其他方式将其变为nil来成为SELECT @variable = variable ...
变量。
nil
关键字与内存管理有关。当变量不是 weak
(即很强)时,表示ARC对分配的实例拥有强大的引用。因此,即使没有其他引用,该实例也将保留在内存中,因为该变量仍然“保留它”。
当变量为weak
时,它没有对它的强引用。这意味着当没有其他强引用时,实例将被释放,并且变量将自动变为weak
。这也解释了为什么弱变量必须是可选的。
您链接到的文档对此进行了非常清晰的解释。
答案 1 :(得分:1)
可选属性和非可选属性的不同之处在于,可选属性可以是nil
,而非可选属性则不能。
weak
和strong
(默认情况下,属性为strong
,没有weak
关键字)属性的不同之处在于,weak
不会增加属性的保留数,而strong
做。如果weak
属性未在其他位置强烈保留,则会将其释放。 weak
属性也必须是可选的。
答案 2 :(得分:1)
weak
与内存管理有关,ARC应该从内存中删除该变量。如果变量弱,那么一旦对该内存的所有强引用被破坏,ARC将立即清除其指向的内存,并且当清除该内存时,即使变量是非可选的,它也将为零,因为其内存为已清除。
但是 optional
与内存无关,它与变量值直接相关,可以包含实际值也可以是nil。