Swift - weak & strong vars
Links[Bearbeiten]
Swift (Programmiersprache)
Einführung[Bearbeiten]
In Swift gibt es die Möglichkeit, Variablen als "strong" oder "weak" zu deklarieren.
Eine "strong" Referenz erstellt eine starke Verbindung zwischen der Variable und dem Objekt, auf das sie verweist. Das bedeutet, solange die Variable eine starke Referenz auf das Objekt hält, wird das Objekt nicht von der Speicherverwaltung des Systems freigegeben. Dies ist das Standardverhalten in Swift.
Eine "weak" Referenz hingegen erstellt eine schwache Verbindung zwischen der Variable und dem Objekt, auf das sie verweist. Das bedeutet, dass das Objekt von der Speicherverwaltung des Systems freigegeben werden kann, wenn es keine andere starke Referenz darauf gibt. Eine schwache Referenz wird verwendet, um einen starken Referenzkreis zu vermeiden. Dies kann passieren, wenn zwei Objekte starke Referenzen aufeinander haben und keines von beiden freigegeben werden kann, da sie beide eine starke Referenz auf das andere haben. Das nennt man einen "Retain-Zyklus" und kann zu einem Speicherleck führen.
In Swift kann man eine Variable als weak deklarieren, indem man das Schlüsselwort "weak" vor der Variablendeklaration setzt, zum Beispiel:
weak var meineVar: MeineKlasse?
Es ist wichtig zu beachten, dass schwache Referenzen optional sind, da das Objekt, auf das sie verweisen, möglicherweise freigegeben wurde, deshalb werden sie als optionale Typen deklariert.
Es ist ebenfalls wichtig zu beachten, dass weak Referenzen nur für Objekte gelten und nicht-objektorientierte Typen wie Int, String usw. nicht als weak deklariert werden können.
Speicherverwaltung ARC[Bearbeiten]
In Swift wird die Speicherverwaltung durch den ARC (Automatic Reference Counting) gehandhabt, der im Hintergrund arbeitet, um den Speicher von Klasseninstanzen freizugeben, sobald sie nicht mehr benötigt werden. Der ARC arbeitet meist von selbst, aber manchmal muss man ihm zusätzliche Informationen zur Verfügung stellen, um die Beziehungen zwischen den Objekten zu klären.
Zum Beispiel, wenn Sie einen Kind-Controller haben, der einen Verweis auf seinen Besitzer/Eltern in einer Eigenschaft speichert, müsste diese Eigenschaft mit dem Schlüsselwort weak gekennzeichnet werden, um einen Kreisverweis/Retain-Zyklus zu vermeiden.
Wenn Sie vermuten, dass es ein Speicherleck gibt, können Sie:
- Prüfen Sie, ob die Deinitialisierungs-Callback aufgerufen wird, nachdem Ihr Objekt entlassen wurde. Wenn Sie nicht dort ankommen, könnte es ein Problem geben
- Prüfen Sie, ob optionale Objekte null sind, nachdem sie entlassen wurden
- Beobachten Sie die Speichernutzung Ihrer App, um zu sehen, ob sie ständig zunimmt
- Verwenden Sie die Instruments "Leaks" und "Allocations"
Speicherlecks verhindern - weak or not to weak[Bearbeiten]
https://medium.com/@almalehdev/you-dont-always-need-weak-self-a778bec505ef
Strong-Weak Dance Pattern (Old School)
let changeColorToRed = DispatchWorkItem { [weak self] in
guard let strongSelf = self else { return }
strongSelf.view.backgroundColor = .red
}
guard let self = self pattern (ab swift 4.2)
let changeColorToRed = DispatchWorkItem { [weak self] in
guard let self = self else { return }
self.view.backgroundColor = .red
}