Утечка памяти в UIControl - PullRequest
       29

Утечка памяти в UIControl

0 голосов
/ 20 января 2019

Я обычно настраиваю UIImageView и UITextField и т. Д., Как в примере ниже. Однако в приведенном ниже примере я получаю утечку памяти и не знаю, почему.

Если я использую стандарт, настроенный с помощью

var buttonImageView: UIImageView!

и настройте buttonImageView в методе init, утечка исчезнет

OR

с приведенным ниже примером, если я сделаю это lazy утечка также исчезнет

Пример * ** тысяча двадцать-один * тысяча двадцать два class BasicButton: UIControl { // Cause of leak var buttonImageView: UIImageView = { let logoView = UIImageView() logoView.contentMode = .scaleAspectFill logoView.tintColor = UIColor.blue logoView.translatesAutoresizingMaskIntoConstraints = false logoView.isUserInteractionEnabled = false return logoView }() init(image: UIImage) { self.init() buttonImageView.image = image setupView() } override init(frame: CGRect) { super.init(frame: frame) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } private func setupView() { addSubview(buttonImageView) setupLayout() } private func setupLayout() { translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ buttonImageView.centerXAnchor.constraint(equalTo: centerXAnchor), buttonImageView.centerYAnchor.constraint(equalTo: centerYAnchor), buttonImageView.heightAnchor.constraint(equalToConstant: 80), buttonImageView.widthAnchor.constraint(equalToConstant: 80) ]) } }

1 Ответ

0 голосов
/ 20 января 2019

Оказывается, я не звонил super.Правильный способ инициализации UIControl будет следующим:

init(image: UIImage) {
    // Fixes Leak
    super.init(frame:CGRect(x: 0, y: 0, width: 100, height: 100))
    // Wrong init was called causing leak
    // self.init()

    buttonImageView.image = image
    setupView()
}

Однако код все равно будет компилироваться и запускаться, но вызывает утечку в процессе.Если бы кто-то мог объяснить, почему это происходит, это было бы оценено.

...