当我有一个引用我的类对象属性的完成块时,我使用[weak self]
。但是,有时候我有一个不引用任何属性的完成块,但是类对象可能会消失并且会被删除。我应该使用[weak self]
吗?当我这样做时,它通常会发出警告Variable 'self' was written to, but never read
doSomeFunction() { [weak self] in
// No references to self here
}
答案 0 :(得分:3)
捕获变量只在内部使用时发生,闭包永远不会捕获变量(不像Java内部类总是捕获this
),所以,你使用变量(包括{ {1}})在封闭内部,它被捕获。
您也可以使用self
,[weak self]
,[weak your_variable_here]
,[unowned self]
,[unowned your_variable_here]
或[self]
如果编译器告诉您[your_variable_here]
,则表示您未在内部使用variable "self" is written to but never read from
,因此不使用self
完全安全,因为[weak self]
将不被捕获,因为它没有被使用。
self
时才需要 weak self
或unowned self
,并且转义传递给它的函数,特别是如果它保存在变量中。
答案 1 :(得分:0)
不,你不需要。 Swift不会对未使用的引用做任何事情,所以 NOT 使用它与使用它一样。
答案 2 :(得分:0)
在闭包中使用[weak self]
是正确/适当的两种情况:
1)闭包引用self
并且它本身也以某种方式由self
保留,或由一个对象保留,而该对象又被self
保留(循环引用/保留循环)
2)闭包引用self
,没有self
的循环引用形式,但意图是闭包不要阻止self
被释放,如果没有其他对self
的引用。
在所有其他情况下,不需要使用[weak self]
,包括闭包没有引用self
(或self
的实例成员)的情况。