从deinit调用removeFromSuperview()

时间:2016-02-03 21:52:56

标签: ios swift cocoa-touch

以下代码对我来说似乎不起作用。

class SomeSubView: UIView {

    deinit {
        removeFromSuperview()
    }

}


let view = UIView()

var subview: SomeSubView! = SomeSubView()
var subview2: SomeSubView! = SomeSubView()

view.addSubview(subview)
view.addSubview(subview2)

subview = nil
subview = SomeSubView()
view.addSubview(subview)

print(view.subviews) //contains three views, should contain two

我在deinit中也有一个print(),所以我很确定它被调用了。我可以在制作表达式subview.removeFromSuperview()之前调用subview = nil,这样可以正常工作。

我只是好奇为什么存在这种限制,deinit内部无法完成哪些事情?我觉得我应该做的事应该工作......

1 个答案:

答案 0 :(得分:4)

永远无需在removeFromSuperview()的{​​{1}}上致电self。超级视图保留其子视图,因此当视图是子视图时,视图无法取消分配。

设置deninit不会释放subview = nil引用的对象。它只是停止使subview引用该对象。