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. |