我对swift中的这个主题感到困惑,据说无主引用必须总是有一个值,不能是可选的,也意味着它们不能被设置为“nil”.. deallocated..PS:如果这有帮助的话.示例“B”是一个可选类型,它对示例“A”有强引用。
wgx48brx1#
当一个对象的强引用计数降为0时,它被解除初始化,但直到它的弱引用计数也降为0时,它才被解除分配。“取消初始化”对象意味着执行它的deinit函数(如果它有一个),释放它持有的任何资源,并清除它可能拥有的任何引用(可能取消初始化和释放更多对象)。“取消分配”是指运行时回收内存。取消初始化的对象的引用计数头仍然有效。当你访问一个weak引用时,Swift运行时会确保该对象仍然处于初始化状态。如果不是,弱引用会被设置为nil,并且被取消初始化的对象的弱引用计数会递减。当你访问一个无主引用时,Swift运行时也会确保该对象处于初始化状态;但如果不是,它不会清除引用(它不能这样做,因为它不是可选的),它会使你的程序崩溃。这有效地使无主引用的行为类似于隐式展开的可选引用,而弱引用的行为类似于可选引用。自归零弱引用和清理崩溃无主引用的折衷是,对象的后备内存不能回收,直到它的所有弱引用都被测试或取消初始化,并且直到它的所有无主引用都被取消初始化。来源:Swift runtime code
deinit
weak
nil
bkkx9g8r2#
unowned引用的目的是保存一个弱引用,以保证(基于应用程序逻辑)不会在具有unowned引用的对象之前被释放。您可以在文档中阅读更多内容。在某种意义上,它类似于隐式展开的可选类型(如String!),你告诉编译器,当它是nil时,你永远不会访问它,如果你这样做,你的程序就会崩溃。
unowned
String!
5lhxktic3#
讨论unowned变量在它指向的对象被释放后“持有”什么是毫无意义的,因为Swift * 保证 * 如果你在它指向的对象被释放后试图访问变量,你的应用会崩溃:另请注意,Swift保证,如果你在它引用的示例被释放后试图访问一个无主引用,你的应用会崩溃。在这种情况下,你永远不会遇到意外的行为。你的应用总是会可靠地崩溃,尽管你当然应该阻止它这样做。
tzcvj98z4#
在Swift中,如果你使用unowned关键字来定义一个对象的引用,并且该对象在你尝试访问它之前就被释放了,那么应用程序就会崩溃。因此,仔细确定你在哪里使用unowned引用是至关重要的。另一方面,如果你不确定对象是否会被释放,你可以使用weak关键字,如果对象被释放,它将自动将引用设置为nil。所以总结一下:->当你确定被引用的对象在其整个生命周期中都可用时,使用unowned。->当你不确定被引用的对象是否会被释放时使用weak。通过使用适当的关键字,可以避免在Swift应用程序中访问释放的对象而导致的崩溃。
4条答案
按热度按时间wgx48brx1#
当一个对象的强引用计数降为0时,它被解除初始化,但直到它的弱引用计数也降为0时,它才被解除分配。
“取消初始化”对象意味着执行它的
deinit
函数(如果它有一个),释放它持有的任何资源,并清除它可能拥有的任何引用(可能取消初始化和释放更多对象)。“取消分配”是指运行时回收内存。取消初始化的对象的引用计数头仍然有效。当你访问一个
weak
引用时,Swift运行时会确保该对象仍然处于初始化状态。如果不是,弱引用会被设置为nil
,并且被取消初始化的对象的弱引用计数会递减。当你访问一个无主引用时,Swift运行时也会确保该对象处于初始化状态;但如果不是,它不会清除引用(它不能这样做,因为它不是可选的),它会使你的程序崩溃。
这有效地使无主引用的行为类似于隐式展开的可选引用,而弱引用的行为类似于可选引用。
自归零弱引用和清理崩溃无主引用的折衷是,对象的后备内存不能回收,直到它的所有弱引用都被测试或取消初始化,并且直到它的所有无主引用都被取消初始化。
来源:Swift runtime code
bkkx9g8r2#
unowned
引用的目的是保存一个弱引用,以保证(基于应用程序逻辑)不会在具有unowned
引用的对象之前被释放。您可以在文档中阅读更多内容。在某种意义上,它类似于隐式展开的可选类型(如
String!
),你告诉编译器,当它是nil
时,你永远不会访问它,如果你这样做,你的程序就会崩溃。5lhxktic3#
讨论
unowned
变量在它指向的对象被释放后“持有”什么是毫无意义的,因为Swift * 保证 * 如果你在它指向的对象被释放后试图访问变量,你的应用会崩溃:另请注意,Swift保证,如果你在它引用的示例被释放后试图访问一个无主引用,你的应用会崩溃。在这种情况下,你永远不会遇到意外的行为。你的应用总是会可靠地崩溃,尽管你当然应该阻止它这样做。
tzcvj98z4#
在Swift中,如果你使用unowned关键字来定义一个对象的引用,并且该对象在你尝试访问它之前就被释放了,那么应用程序就会崩溃。因此,仔细确定你在哪里使用unowned引用是至关重要的。另一方面,如果你不确定对象是否会被释放,你可以使用weak关键字,如果对象被释放,它将自动将引用设置为nil。
所以总结一下:
->当你确定被引用的对象在其整个生命周期中都可用时,使用unowned。
->当你不确定被引用的对象是否会被释放时使用weak。
通过使用适当的关键字,可以避免在Swift应用程序中访问释放的对象而导致的崩溃。