Sobes.tech
Middle

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.