Управление памятью ARC меняется в каждом примере - PullRequest
0 голосов
/ 15 октября 2018

Примечание: я создал тестовую программу, чтобы лучше понять, как работает ARC - у меня возникли проблемы с ее реализацией в моем реальном проекте.

Я создал тестовую программу, чтобы определить, как работает ARC - она ​​отлично работает!Вот оно.

ViewController1:

import UIKit

class ViewController: UIViewController {

    weak var vc2:ViewController2?

    override func viewDidLoad() {
        super.viewDidLoad()
        print("VC1 Initialized")
        addButton()
    }

    func addButton() {
        let button = UIButton(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
        button.backgroundColor = .red
        button.setTitle("Go to VC2", for: .normal)
        self.view.addSubview(button)
        button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
    }

    @objc func buttonAction(sender: UIButton!) {
        let vx = ViewController2()
        vx.VC1 = self
        vc2 = vx
        self.present(vc2!, animated: false, completion: nil)
    }
}

ViewController2:

import UIKit

class ViewController2: UIViewController {

    weak var VC1:ViewController?
    weak var VC3:ViewController3?

    override func viewDidLoad() {
        super.viewDidLoad()
        print("VC2 Initialized")
        addButton()
    }

    deinit {
         print("VC2 Deinitialized")
    }

    func addButton() {
        for i in 0..<2 {
            let button = UIButton(frame: CGRect(x: 0, y: self.view.frame.height*0.5*CGFloat(i), width: self.view.frame.width, height: self.view.frame.height*0.5))
            button.backgroundColor = i == 0 ? .red : .blue
            button.setTitle("Go to VC\(i*2+1)", for: .normal)
            self.view.addSubview(button)
            button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
            button.tag = i
        }
    }

    @objc func buttonAction(sender: UIButton!) {
        let tag = sender.tag
        if(tag == 0) {
            self.dismiss(animated: true, completion: nil)
        }
        else {
            let vc3 = ViewController3()
            vc3.ViewController2 = self
            VC3 = vc3
            self.present(VC3!, animated: true, completion: nil)
        }
    }
}

ViewController3:

import UIKit

class ViewController3: UIViewController {

    var ViewController2:ViewController2?

    override func viewDidLoad() {
        super.viewDidLoad()
        print("VC3 Initialized")
        addButton() 
    }

    deinit {
        print("VC3 Deinitialized")
    }

    func addButton() {
        let button = UIButton(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
        button.backgroundColor = .red
        button.setTitle("Go to VC1", for: .normal)
        self.view.addSubview(button)
        button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
    }

    @objc func buttonAction(sender: UIButton!) {
        self.ViewController2!.VC1!.dismiss(animated: true, completion: nil)
    }
}

То, на что я смотрел, было, какчтобы удалить несколько страниц за раз (как указано нажатием кнопки на VC3, и он возвращается на главную страницу) и все еще удалить память ARC.Все хорошо.Вы можете видеть вывод ниже, что я выполняю эти операции.

Start program - push to page 2 - push to page. 1 - push to page 2 - push to page 3 - go to page 1

VC1 Initialized
VC2 Initialized
VC2 Deinitialized
VC2 Initialized
VC3 Initialized
VC3 Deinitialized
VC2 Deinitialized

Проблема, с которой я сталкиваюсь, заключается в моей реальной программе - когда я использую эти методы выше, она автоматическивызывает deinit для последнего объекта, который я создал, когда СОЗДАЮ свой новый объект.Но на самом деле он ничего не удаляет - график памяти покажет x количество элементов, даже если вызывается метод deinit.

import UIKIT

class myClass: UIViewController {

    weak var pageController:PageController?

    override func viewDidLoad() {
        super.viewDidLoad()
        print("Initialized PC")
        presentThemes()
    }

    func presentThemes() {
        let pg = PageController(x: 1, controller: self)
        pageController = pg
        self.present(pageController!, animated: true, completion: nil)
    }

    deinit {
        print("Deinit")
    }
}

Вывод, который мне предоставляется:

Initialized PC  

На первом экземпляре и:

Deinit
Initialized PC

На втором экземпляре.Любая идея, почему Deinit вызывается, но график памяти показывает это там?

...