Sobes.tech
Middle

Miért kell felszabadítanunk az IBOutletokat a viewDidUnload módszerben?

sobes.tech MI

Válasz az MI-től

A viewDidUnload akkor hívódik meg, miután a vezérlő nézete ki lett töltve a memóriából, általában erőforráshiány miatt. Ebben a módszerben felszabadítjuk (nil vagy deallocate) az IBOutlet-eket, amelyek hivatkozásokat tartalmaznak a felhasználói felület elemeire, hogy megszakítsuk a erős hivatkozási ciklusokat, és lehetővé tegyük ezeknek az elemeknek a memóriából való felszabadítását. Ez megelőzi a memóriaszivárgásokat.

class ViewController: UIViewController {

    @IBOutlet weak var myLabel: UILabel!

    override func viewDidUnload() {
        super.viewDidUnload()
        // Bármilyen fő nézet alnézetének felszabadítása.
        // pl., self.myOutlet = nil;
        myLabel = nil // IBOutlet felszabadítása
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // UI elemek itt újra létrehozhatók
        if myLabel == nil {
            // szükség szerint újra létrehozni vagy újra inicializálni a címkét
        }
    }
}

Fontos megjegyezni, hogy az iOS 6-tól kezdve és későbbi verziókban a viewDidUnload már nem létezik és nem hívódik meg. A nézetek memória kezelése most automatikusan történik Weak References (@IBOutlet weak) és Automatic Reference Counting (ARC) segítségével. Az weak-ként megjelölt IBOutlet-ek automatikusan nil-re változnak, amikor a megfelelő nézetobjektum kiürül a memóriából.

Ezért a modern iOS fejlesztésben nem szükséges és nem is hatékony az IBOutlet-ek explicitt felszabadítása a viewDidUnload-ban.

iOS verzió viewDidUnload viselkedése Ajánlás az IBOutlet-hez
iOS 6-ig A nézet kiürítésekor hívódik. nil-re állítani.
iOS 6+ Nem hívódik meg. Használjon weak-et.