Sobes.tech
Middle

Zašto treba da oslobodimo IBOutlet-ove u metodi viewDidUnload?

sobes.tech АИ

Одговор од АИ

viewDidUnload se poziva nakon što je prikaz kontrolera bude uklonjen iz memorije, obično zbog nedostatka resursa. U ovom metodu oslobađamo (nil ili deallocate) IBOutlet-ove koji drže reference na elemente korisničkog interfejsa, kako bismo prekinuli cikluse jakih referenci i omogućili oslobađanje memorije koju ti elementi zauzimaju. Ovo sprečava curenje memorije.

class ViewController: UIViewController {

    @IBOutlet weak var myLabel: UILabel!

    override func viewDidUnload() {
        super.viewDidUnload()
        // Oslobađanje bilo kakvih podprikaza glavnog prikaza.
        // npr., self.myOutlet = nil;
        myLabel = nil // Oslobađamo IBOutlet
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // UI elementi mogu biti ponovo kreirani ovde
        if myLabel == nil {
            // Ponovo kreirati ili re-inicijalizovati labelu ako je potrebno
        }
    }
}

Važno je napomenuti da od iOS 6 i kasnijih verzija, metoda viewDidUnload je uklonjena i više se ne poziva. Upravljanje memorijom za prikaze je sada automatizovano korišćenjem Weak References (@IBOutlet weak) i Automatic Reference Counting (ARC). IBOutlet-ovi označeni kao weak automatski postaju nil kada odgovarajući objekat prikaza bude uklonjen iz memorije.

Zbog toga, u modernom razvoju iOS, eksplicitno oslobađanje IBOutlet-ova u viewDidUnload nije potrebno i nema efekta.

Verzija iOS Ponašanje viewDidUnload Preporuka za IBOutlet
Do iOS 6 Poziva se pri uklanjanju prikaza iz memorije. Postaviti na nil.
iOS 6+ Nije pozivan. Koristiti weak.