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