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