Waarom moeten we de IBOutlet vrijgeven in de viewDidUnload-methode?
sobes.tech AI
Antwoord van AI
viewDidUnload wordt aangeroepen nadat de view van de controller uit het geheugen is geladen, meestal vanwege een gebrek aan bronnen. In deze methode maken we de IBOutlet vrij (nil of deallocate) die verwijzingen naar de elementen van de gebruikersinterface vasthouden, om sterke referentiecirkels te doorbreken en het geheugen dat door deze elementen wordt ingenomen vrij te maken. Dit voorkomt geheugenlekken.
class ViewController: UIViewController {
@IBOutlet weak var myLabel: UILabel!
override func viewDidUnload() {
super.viewDidUnload()
// Vrijmaken van alle vastgehouden subviews van de hoofdview.
// bijv., self.myOutlet = nil;
myLabel = nil // Vrijmaken van IBOutlet
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// UI-elementen kunnen hier worden opnieuw gemaakt
if myLabel == nil {
// Label opnieuw maken of herinitialiseren indien nodig
}
}
}
Het is belangrijk op te merken dat vanaf iOS 6 en latere versies, de methode viewDidUnload is verwijderd en niet meer wordt aangeroepen. Het geheugenbeheer voor views is nu geautomatiseerd met behulp van Weak References (@IBOutlet weak) en Automatic Reference Counting (ARC). IBOutlet's gemarkeerd als weak worden automatisch nil wanneer het bijbehorende view-object uit het geheugen wordt verwijderd.
Daarom is het in moderne iOS-ontwikkeling niet nodig en niet effectief om IBOutlet expliciet vrij te maken in viewDidUnload.
| iOS-versie | Gedrag van viewDidUnload |
Aanbeveling voor IBOutlet |
|---|---|---|
| Tot iOS 6 | Wordt aangeroepen bij het vrijmaken van de view uit het geheugen. | nil maken. |
| iOS 6+ | Wordt niet aangeroepen. | Gebruik weak. |