【发布时间】: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 的确切时间被释放”它可能是。
-
"此代码有效!"这是未定义的行为。任何事情都有可能发生。仅仅因为在这种情况下它似乎产生了正确的输出并不意味着它“有效”。向释放的对象发送消息通常不会“崩溃”。并且不能保证仅因为您没有对它的任何强引用(例如,它可能已被自动释放)而释放对象。