【问题标题】:When are objects that hold unowned references deallocated?什么时候释放持有无主引用的对象?
【发布时间】:2014-06-09 21:35:50
【问题描述】:

我在玩无主引用。正如我从 WWDC 视频中了解到的,无主引用不能是 nil,并且它们不会增加它们引用的任何对象的保留计数。我认为如果一个无主引用被释放,那么持有无主引用的对象也被释放。

考虑以下代码:

class Parent {
    var child : Child?

    func foo() {
        println("Hello")
    }
}

class Child {
    unowned let parent : Parent

    init(parent: Parent) {
        self.parent = parent
    }
}

var parent : Parent? = Parent()
parent!.child = Child(parent: parent!)

weak var child = parent!.child

parent = nil

child!.parent.foo()

此代码有效! child 怎么会存在,而且parent 怎么还存在?原以为设置parent = nil后,child也会是nil。似乎无主引用的行为就好像它是一个强引用。

关于此代码为何有效的任何想法?

【问题讨论】:

  • 它不会在您设置parent=nil 的确切时间发布,它很可能会在您退出当前范围后发布,但我相信这也不能保证。此外,weak 是您应该使用的,如果您希望它在被释放后被 nil 淘汰。 unowned 的行为略有不同
  • @JackWu:“它不会在你设置 parent=nil 的确切时间被释放”它可能是。
  • "此代码有效!"这是未定义的行为。任何事情都有可能发生。仅仅因为在这种情况下它似乎产生了正确的输出并不意味着它“有效”。向释放的对象发送消息通常不会“崩溃”。并且不能保证仅因为您没有对它的任何强引用(例如,它可能已被自动释放)而释放对象。

标签: ios swift


【解决方案1】:

您的代码很可能只在操场上工作,那里的内存管理有点……模糊。

当我在 Xcode 中运行它时,它会崩溃,正如你所期望的那样。 Playground 旨在让测试语法、玩一些类等变得容易。它不是玩弱/未保留变量的最佳场所。

我还没有找到任何描述在 Playground 中究竟是如何管理内存的文档来源,但它肯定与实际运行时中的管理方式不同。

【讨论】:

  • Gah... 这不是我第一次错误地认为 Playground 和“真实”Swift 的行为方式相同。我要写一个错误报告。谢谢!
  • 是的,操场definitely seems to keep hold of variables itself,所以它不是测试释放的最佳场所。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多