Это мой код:
import UIKit
class MyView: UIView {
var nextView: NextView?
private var button: UIButton! = UIButton()
init(){
super.init(frame: CGRect.zero)
commonLoad()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonLoad()
}
private func commonLoad() {
addSubview(button)
button.translatesAutoresizingMaskIntoConstraints = false //comment this on and off to see the change
}
override func layoutSubviews() {
super.layoutSubviews()
nextView = NextView(view: self)
}
deinit {
print("deinit my view")
}
}
class NextView {
private weak var view: UIView?
init(view: UIView){
self.view = view
guard let v = self.view else { fatalError() }
let anotherSubView = UIView()
v.addSubview(anotherSubView)
}
deinit {
print("Deinit next view")
}
}
class Test: UIViewController{
override func viewDidAppear(_ animated: Bool) {
Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { (_) in
let storyBoard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "otherVC") as! otherVC
UIApplication.shared.keyWindow?.rootViewController = nextViewController
}
}
}
Обратите внимание на комментарий при изменении значения translatesAutoresizingMaskIntoConstraints с помощью кнопки. Изменение этого значения приведет к такому странному поведению.
Это мой журнал после добавления MyView в раскадровку в классе Test:
Deinit next view //<-- Instant called, WHY?!
deinit my view //<-- after 1 second, good
Deinit next view //<-- after 1 second, good, but why did it created another object of NextView?
При выключении комментария translatesAutoresizingMaskIntoConstraints первый журнал печати исчезает. Почему изменение значения translatesAutoresizingMaskIntoConstraints мгновенно создает и обнуляет объект NextView?