以下代码对我来说似乎不起作用。
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
内部无法完成哪些事情?我觉得我应该做的事应该工作......
答案 0 :(得分:4)
永远无需在removeFromSuperview()
的{{1}}上致电self
。超级视图保留其子视图,因此当视图是子视图时,视图无法取消分配。
设置deninit
不会释放subview = nil
引用的对象。它只是停止使subview
引用该对象。