У меня есть UIView, который я добавляю к UIViewController, и обычно я тестирую деинициализацию, чтобы убедиться, что я все делаю правильно. Но когда я не устанавливаю переменную в моем viewController на nil и использую только .removeFromSuperView() , метод deinit() в UIView не будет вызываться, пока я не добавлю UIView в другой раз, а затем его вызов. Но если я использую removeFromSuperView() и устанавливаю переменную в nil, то сразу же вызывается deinit(). Почему это?
Вот класс UIView():
class TestView: UIView {
override init(frame: CGRect) {
super.init(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
print("init is happneing")
}
deinit {
print("de init is happneing")
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Вот родительский ViewController:
class MyViewController: UIViewController {
var tstview : TestView?
//adding the UIView by tapping on a button
@IBAction func addView(_ sender: UIButton) {
let test = TestView()
tstview = test
tstview?.frame = CGRect(x: 50, y: 60, width: self.view.frame.width-100, height: self.view.frame.height-200)
tstview?.backgroundColor = UIColor.white
self.view.addSubview(tstview!)
}
override func viewDidLoad() {
super.viewDidLoad()
}
//removing UIView by touching elsewhere
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
tstview?.removeFromSuperview()
// tstview = nil
}
}