被取消初始化时,Unowned引用是否设置为“nil”?

我很快就对这个话题感到困惑,因为无主的引用必须总是有一个值,不能是可选的,也就是说它们不能被设置为'nil'….好吧,我只是在Apple文档中看到一个程序对于swift而言,对实例“B”的无主引用的实例“A”被去初始化并且在实例“B”被去初始化/释放之后解除分配……当var被去初始化/ dealloc并不意味着它们是设为'无'? 实例B是一个可选的,所以确保它可以容纳'零',但为什么实例'A'被取消初始化,当它应该总是有一个值?

PS:如果这有帮助…..实例'B'是一个可选的types,强烈的引用实例'A'

unowned引用的一点是,在unownedunowned引用的对象之前,不能保留对你保证的东西(基于你的应用逻辑)的弱引用。 您可以在文档中阅读更多内容 。

从某种意义上讲,它与隐式解包可选types(如String! )类似。 你告诉编译器,当它是nil ,你将永远不会访问这个值,如果你这样做,你的程序将会崩溃。

在它指向的对象已经被释放后,讨论一个unownedvariables“持有”是什么意思,因为Swift 保证你的应用程序会在它指向的对象被释放后尝试访问variables时崩溃:

还要注意的是,Swift保证你的应用程序将崩溃,如果你尝试访问一个无主的引用后,它引用的实例被释放。 在这种情况下,你永远不会遇到意外的行为。 您的应用程序将始终可靠地崩溃,虽然您当然应该阻止它这样做。

当一个对象的强引用计数下降到0时,对象被去初始化,但是直到它的弱引用计数也下降到0,对象才被释放。

对象的“初始化”意味着如果它的deinit函数有一个,释放它所拥有的任何资源,并清除它可能具有的任何引用(可能会取消初始化和释放更多的对象),它将被执行。 “释放”是运行时回收内存的时间。 取消初始化的对象的引用计数标题仍然有效。

当你访问一个weak引用时,Swift运行时确保对象仍处于初始化状态。 如果不是,则将弱引用设置nil并将非初始化对象的弱引用计数递减。

无主的参考也计入弱引用计数。 当你访问一个无主的引用时,Swift运行时也确保对象处于初始化状态; 但如果不是,而不是清除引用(它不能这样做,因为它不是可选的),它崩溃了你的程序。

这有效地使得一个无主引用的行为像一个隐式解开的可选项,而一个弱引用的行为像一个可选的行为。

自清零弱引用和干净崩溃的无主引用的权衡是,直到所有弱引用都已经过testing或取消初始化,并且直到所有的非拥有引用都被初始化为止,对象的后备内存才能被回收。

来源: Swift运行时代码