Dlaczego powinniśmy zwolnić IBOutlet w metodzie viewDidUnload?
sobes.tech AI
Odpowiedź od AI
viewDidUnload jest wywoływane po tym, jak widok kontrolera zostanie zwolniony z pamięci, zazwyczaj z powodu braku zasobów. W tym metodzie zwalniamy (nil lub deallocate) IBOutlet, które przechowują odwołania do elementów interfejsu użytkownika, aby przerwać cykle silnych odwołań i umożliwić zwolnienie pamięci zajmowanej przez te elementy. Zapobiega to wyciekom pamięci.
class ViewController: UIViewController {
@IBOutlet weak var myLabel: UILabel!
override func viewDidUnload() {
super.viewDidUnload()
// Zwolnij wszelkie zatrzymane podwidoki głównego widoku.
// np. self.myOutlet = nil;
myLabel = nil // Zwolnienie IBOutlet
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Elementy UI mogą być tutaj odtworzone
if myLabel == nil {
// Odtwórz lub zainicjuj ponownie etykietę, jeśli to konieczne
}
}
}
Ważne jest, aby zauważyć, że od iOS 6 i nowszych wersji, metoda viewDidUnload została usunięta i nie jest już wywoływana. Zarządzanie pamięcią dla widoków jest teraz zautomatyzowane przy użyciu słabych referencji (@IBOutlet weak) i automatycznego zliczania referencji (ARC). IBOutlet oznaczone jako weak automatycznie stają się nil, gdy odpowiadający obiekt widoku jest zwolniony z pamięci.
Dlatego w nowoczesnym rozwoju iOS nie jest konieczne ani skuteczne jawne zwalnianie IBOutlet w viewDidUnload.
| Wersja iOS | Zachowanie viewDidUnload |
Rekomendacja dla IBOutlet |
|---|---|---|
| Do iOS 6 | Wywoływane przy zwalnianiu widoku z pamięci. | Zwolnij (nil). |
| iOS 6+ | Nie jest wywoływane. | Używaj weak. |