Контроллер навигации не освобождает память, утечка памяти? - PullRequest
0 голосов
/ 28 марта 2019

Я создал навигацию, которая выдвигает контроллер вида, который содержит вид изображения, и кнопку, которая добавляет тот же контроллер вида при каждом нажатии кнопки.После каждого нажатия память увеличивается, а после каждого следующего нажатия память не освобождается, несмотря на то, что вызывается deinit.В коде нет ничего, что указывало бы на утечку памяти, есть что-то, чего мне не хватает, спасибо?

полный репозиторий проекта

class ViewController: UIViewController {


     lazy var nextButton:UIButton? = {
        let button = UIButton(type: .roundedRect)
        button.setTitle("Next", for: .normal)
        button.addTarget(self, action: #selector(nextButtonTapped), for: .touchUpInside)
        button.translatesAutoresizingMaskIntoConstraints = false
        button.backgroundColor = UIColor.red
        return button
    }()

     lazy var imageView:UIImageView? = {
        let image = #imageLiteral(resourceName: "DJI_0014")
        let imageView = UIImageView(image: image)
        imageView.translatesAutoresizingMaskIntoConstraints = false
        return imageView
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        guard let imageView = self.imageView, let nextButton = self.nextButton else{
            print("imageView, nextButton are nil")
            return
        }

        self.view.backgroundColor = UIColor.white

        self.view.addSubview(imageView)
        NSLayoutConstraint.activate([
            imageView.topAnchor.constraint(equalTo:self.view.topAnchor),
            imageView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
            imageView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
            imageView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)])

        view.addSubview(nextButton)
        NSLayoutConstraint.activate([nextButton.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
            nextButton.centerYAnchor.constraint(equalTo: self.view.centerYAnchor, constant: 0),nextButton.heightAnchor.constraint(equalToConstant: 200),nextButton.widthAnchor.constraint(equalToConstant: 200)])
    }

    @objc func nextButtonTapped(){
        print("next button tapped")
        self.navigationController?.pushViewController(ViewController(), animated: true)
    }

    deinit {
        print("view controller is deinitialized")
    }

}

Я смотрел другие перечисленные вопросыниже и попытался принять их предложения, но ни одно из них, похоже, не помогло

Память навигационной дуги не освобождена

Проблема утечки памяти в контроллере навигации

Memory Degbugger

1 Ответ

0 голосов
/ 28 марта 2019

Наконец, я определил проблему, которая находится на панели навигации:

` navigationController?.setNavigationBarHidden(true, animated: false)`

Этот код удалит все проблемы с большими остатками памяти. Другие части кодов в порядке. и в этой ситуации вся память будет постоянно находиться на уровне около 19 млн.

Я попытался использовать navigationDelegate, чтобы выполнить переход, и обнаружил, что система упускает из виду сбой и считает, что при повторном нажатии push vc NavigationBar будет плохо компоноваться. Так что я скрываю это, и проблема исчезла. Но если вам нужен навигационный бар или его анимация, здесь будет много работы.

Но проблема с памятью найдена.

...