Was ist unowned?
sobes.tech KI
Antwort von AI
unowned — ist ein Schlüsselwort in Swift zur Deklaration einer schwachen Referenz. Es wird verwendet, wenn zwei Objekte eine starke Beziehung haben und ihre Lebenszyklen voneinander abhängen, aber wir möchten zyklische Referenzen vermeiden, die die Speicherfreigabe behindern könnten.
Hauptmerkmale und Unterschiede zu weak:
- Nicht optional: Die
unowned-Referenz wird während der gesamten Lebensdauer des referenzierten Objekts garantiert nichtnilsein. - Starke Beziehung: Wird verwendet, wenn ein Objekt ein anderes besitzt und beide immer zusammen existieren.
- Bei Freigabe: Wenn das Objekt, auf das sich die
unowned-Referenz bezieht, vor der Verwendung der Referenz aus dem Speicher entfernt wird, führt dies zu einem Laufzeitfehler. Es ist notwendig sicherzustellen, dass das referenzierte Objekt länger existiert als die Referenz selbst. - Anwendung: Wird häufig bei Delegierten verwendet, wenn der Delegierte immer länger existiert als das Objekt, das ihn aufruft, oder in Closures, um zyklische Referenzen auf
selfzu vermeiden, wenn das Closureselfnicht stark erfasst.
Beispiel für die Verwendung in einem Closure:
// swift
class MyClass {
var name: String
var closure: (() -> Void)?
init(name: String) {
self.name = name
}
func setupClosure() {
closure = { [unowned self] in // Verwendung von unowned self
print("Mein Name ist \(self.name)")
}
}
deinit {
print("\(name) wurde deinitialisiert")
}
}
Beispiel für die Verwendung bei einem Delegate (obwohl weak häufiger bei Delegates verwendet wird, ist unowned auch möglich, wenn der Delegate garantiert länger lebt):
// swift
protocol MyDelegate: AnyObject { // AnyObject erfordert einen Referenztyp
func doSomething()
}
class DataSource {
unowned var delegate: MyDelegate // unowned Referenz auf den Delegate
init(delegate: MyDelegate) {
self.delegate = delegate
}
func performAction() {
delegate.doSomething()
}
deinit {
print("DataSource wurde deinitialisiert")
}
}
class MyController: MyDelegate {
var dataSource: DataSource?
override init() {
super.init()
dataSource = DataSource(delegate: self)
}
func doSomething() {
print("Delegate-Methode aufgerufen")
}
deinit {
print("MyController wurde deinitialisiert")
}
}
Die Wahl zwischen weak und unowned hängt davon ab, ob die Referenz optional ist und ob das referenzierte Objekt garantiert bis zum Ende der Referenz lebt. Wenn die Möglichkeit besteht, dass das Objekt vor der Verwendung der Referenz freigegeben wird, sollte weak verwendet werden. Wenn die Existenz garantiert ist und die Referenz nicht optional sein soll, kann unowned verwendet werden.