如果我在完成块中没有真正引用自我,我应该使用[弱自我]吗?

时间:2018-02-25 22:04:47

标签: swift

当我有一个引用我的类对象属性的完成块时,我使用[weak self]。但是,有时候我有一个不引用任何属性的完成块,但是类对象可能会消失并且会被删除。我应该使用[weak self]吗?当我这样做时,它通常会发出警告Variable 'self' was written to, but never read

doSomeFunction() { [weak self] in
   // No references to self here
}

3 个答案:

答案 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 selfunowned self,并且转义传递给它的函数,特别是如果它保存在变量中。

请参阅Closures in Apple's Official Swift Documentation

答案 1 :(得分:0)

不,你不需要。 Swift不会对未使用的引用做任何事情,所以 NOT 使用它与使用它一样。

答案 2 :(得分:0)

在闭包中使用[weak self]是正确/适当的两种情况:

1)闭包引用self并且它本身也以某种方式由self保留,或由一个对象保留,而该对象又被self保留(循环引用/保留循环)

2)闭包引用self,没有self的循环引用形式,但意图是闭包不要阻止self被释放,如果没有其他对self的引用。

在所有其他情况下,不需要使用[weak self],包括闭包没有引用self(或self的实例成员)的情况。