函数参数应该弱吗?

时间:2020-06-27 13:21:20

标签: swift closures automatic-ref-counting weak-references

我有以下情况,参考文献薄弱:

function hello(to persons: [Person]) {
    /// should persons be also weak below?
    helloView.didHelloPressed = { [weak self] someFlag in 
        self?.configurePersons(persons)
    }
}

在上面的代码中,我捕获了较弱的东西,并且我知道self应该很弱,因为我使用了它的功能(configurePersons)。但是persons函数的参数hello数组也应该弱吗?我认为是的,但是我没有明确解释。我以为如果self不为零,那么persons也将不为零,并且使其变弱也没有道理。

3 个答案:

答案 0 :(得分:1)

数组是Swift中的值类型。它不受ARC管理。因此,答案是否定的。

答案 1 :(得分:1)

在Swift中,强烈引用了函数参数。我也不确定是否有办法将任何参数作为弱引用传递。在这种情况下,没有循环调用函数hello(to: person)。因此,答案是否定的。

答案 2 :(得分:1)

弱引用不是您应该使用的“仅仅是因为我看到一个闭包”。

即使使用闭包,甚至使用self,在很多时候您也不想使用弱引用。

存在弱引用会破坏强引用周期。而已。闭包的捕获变量是存在的一种强大参考。如果闭包强烈捕获变量,则不会发生任何令人恐惧的事情。

问题是当闭包捕获foo,然后将闭包存储在foo中时。那是一个很强的参考周期,需要打破。这两个引用之一必须很弱,因此要么应该将闭合foo保持在较弱的位置,要么应该将foo保持在较弱的位置。

您的persons的类型为Array<Person>。如果这些Person对象之一强烈引用helloView,而对象本身强烈引用其didHelloPressed闭包,则可能存在强引用周期。但这将很奇怪,并且几乎可以肯定(希望如此!)不是您在做什么,所以不,不需要弱捕获persons

更甚者,取决于helloViewself在这种情况下的关系,您很有可能也想牢牢抓住自己。