Deinit никогда не вызывал пользовательский UIView - PullRequest
0 голосов
/ 26 июня 2018

Здравствуйте, у меня есть UIViewController, который имеет 4 пользовательских UIView. Функция deinit внутри UIViewController вызывается, когда я изменяю rootViewController, но не вызывается внутри custom UIView. Следовательно, он сохраняется в памяти после смены корневого контроллера. Если я вызываю myCustomView.removeFromSuperView() внутри функции ViewControllers Deinit, она работает. Тем не менее, я не хочу писать это каждый раз в viewcontrollers, поэтому я хочу написать это внутри пользовательского класса UIView, но Deinit внутри Custom UIView никогда не вызывается.

Как мне объявить пользовательский вид:

lazy var myCustomView = WelcomeScreenButtonView(text: getLabelText(key: SUPPORTEDSERVICES), imageName: "img")
let firstStackView = UIStackView()

override func viewDidLoad(){
//I put it inside a UIStackView
firstStackView.addArrangedSubview(myCustomView)
view.addSubView(firstStackView)
}
deinit{
//If I do it like this, It works but I don't wanna call it in here
myCustomView.removeFromSuperView()
}

Мой пользовательский класс UIView:

class WelcomeScreenButtonView: UIView {

lazy var label = UILabel()
private lazy var logoImage = UIImageView()

override init(frame: CGRect) {
    super.init(frame: frame)
    setupUI()
    setupConstraints()
}
required public init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}
deinit {
    //This one never get called
    print("WelcomeScreen Button Deinited")
    removeFromSuperview()
}
}

РЕДАКТИРОВАТЬ: Если я изменю свой пользовательский вид на UIView () (все остальные коды такие же). Это освобождает. Поэтому я думаю, что я имею отношение к пользовательскому классу UIView.

1 Ответ

0 голосов
/ 26 июня 2018

Если ваше представление является подпредставлением другого представления, то это суперпредставление содержит сильную ссылку на ваше подпредставление - поэтому, очевидно, его нельзя отменить.

deinit будет вызываться только после того, как счетчик ссылок вашего представления уменьшится до 0, поэтому для вызова deinit необходимо сначала удалить его из суперпредставления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...