Sobes.tech
Middle

Prečo by sme mali uvoľniť IBOutlet v metóde viewDidUnload?

sobes.tech AI

Odpoveď od AI

viewDidUnload sa volá po tom, ako je pohľad kontroléra odvolaný z pamäte, zvyčajne kvôli nedostatku zdrojov. V tomto momente uvoľníme (nil alebo deallocate) IBOutlet, ktoré držia odkazy na prvky používateľského rozhrania, aby sme prerušili cykly silných odkazov a umožnili uvoľnenie pamäte obsadenej týmito prvkami. Tým sa predchádza únikom pamäte.

class ViewController: UIViewController {

    @IBOutlet weak var myLabel: UILabel!

    override func viewDidUnload() {
        super.viewDidUnload()
        // Uvoľniť akékoľvek podzobrazenia hlavného pohľadu.
        // napr., self.myOutlet = nil;
        myLabel = nil // Uvoľnenie IBOutlet
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // UI prvky môžu byť znovu vytvorené tu
        if myLabel == nil {
            // Znova vytvoriť alebo re-inicializovať štítok, ak je to potrebné
        }
    }
}

Dôležité je poznamenať, že od iOS 6 a novších je metóda viewDidUnload odstránená a už sa nevolá. Správa pamäte pre pohľady je teraz automatizovaná pomocou Weak References (@IBOutlet weak) a Automatic Reference Counting (ARC). IBOutlet-ové označené ako weak sa automaticky stanú nil, keď príslušný objekt pohľadu je odvolaný z pamäti.

Preto v modernom vývoji iOS nie je potrebné ani efektívne explicitne uvoľňovať IBOutlet-ové v viewDidUnload.

Verzia iOS Správanie viewDidUnload Odporúčanie pre IBOutlet
Do iOS 6 Volá sa pri odvolaní pohľadu z pamäti. Nastaviť na nil.
iOS 6+ Nie je volané. Používať weak.