无主与弱.为什么我们应该更喜欢无主?

one*_*cat 11 memory-management swift

正如Apple在"Swift编程语言"中所说,似乎我们应该unownedweak任何可能的更喜欢:

如果捕获的引用永远不会变为nil,则应始终将其捕获为无主引用,而不是弱引用.

本页的"弱和无主参考"部分

我确实知道这两者之间的区别.但我好奇的是有没有很好的理由,宁愿 unownedweak?我认为weak更安全,我们可以总是编写[weak obj]和可选的绑定检查,而不考虑存在的可能性obj.

它与某些性能考虑或我错过的东西有关吗?或者是否完全可以使用weak而不是一直使用unowned

Ivi*_* M. 17

'nil'一旦它们指向的对象被解除分配,弱引用就会自动设置.为了在Swift中实现这一点,必须将它们声明为'var'可选:

class SomeOtherClass {
    weak var weakProperty: SomeClass?
}
Run Code Online (Sandbox Code Playgroud)

如果在实例仍处于活动状态时'weakProperty'可以成为可能'nil','SomeOtherClass'并且我们想在使用它之前检查它(委托是一个这样的例子),这很好.但是,如果某些引用永远不应该在逻辑上存在'nil'并且我们仍然希望阻止保留周期呢?在Objective-C中,任何对象引用都可以'nil'(并且消息传递'nil'总是无声地失败),因此我们总是使用不存在的困境'weak'.但Swift根本没有可用的参考文献.我们使用选项来处理语义上缺乏价值的东西.但是我们不应该被迫使用选项来获得必须始终具有价值的东西,只是为了能够打破一个保留周期.这种做法违背了期权的预期语义.那是哪里'unowned'来的.它有两种口味 - 'unowned(safe)''unowned(unsafe)'.后者是危险的,它'assign''unsafe_unretained'Objective-C 相当.但前者是默认的(至少在调试时,不确定它们是否在发布版本中将其优化为"无主(不安全)"),如果引用的对象过早地被释放,将会可靠地崩溃我们的应用程序.当然,如果出现问题,我们的应用程序会崩溃,但调试比默认失败要容易得多.它应该只在我们真正想要的时候默默地失败(在这种情况下我们会使用'weak')