Sowohl weakals auch unownedReferenzen erzeugen keinen strongHalt für das referenzierte Objekt (auch bekannt als Erhöhung der Aufbewahrungsanzahl, um zu verhindern, dass ARC die Zuordnung des referenzierten Objekts aufhebt).
Aber warum zwei Schlüsselwörter? Diese Unterscheidung hat damit zu tun, dass OptionalTypen in der Swift-Sprache integriert sind. Lange Rede, kurzer Sinn: Optionale Typen bieten Speichersicherheit (dies funktioniert hervorragend mit den Konstruktorregeln von Swift, die streng sind, um diesen Vorteil zu bieten).
Eine weakReferenz ermöglicht die Möglichkeit, dass sie wird nil(dies geschieht automatisch, wenn die Zuordnung des referenzierten Objekts aufgehoben wird). Daher muss der Typ Ihrer Eigenschaft optional sein. Sie als Programmierer sind daher verpflichtet, diese zu überprüfen, bevor Sie sie verwenden (im Grunde genommen die Der Compiler zwingt Sie so weit wie möglich, sicheren Code zu schreiben.
Eine unownedReferenz geht davon aus, dass es zu nilLebzeiten niemals werden wird . Während der Initialisierung muss eine nicht besessene Referenz festgelegt werden. Dies bedeutet, dass die Referenz als nicht optionaler Typ definiert wird, der ohne Überprüfungen sicher verwendet werden kann. Wenn die Zuordnung des Objekts, auf das verwiesen wird, irgendwie aufgehoben wird, stürzt die App ab, wenn die nicht besessene Referenz verwendet wird.
Aus den Apple-Dokumenten :
Verwenden Sie eine schwache Referenz, wenn es gültig ist, dass diese Referenz irgendwann während ihrer Lebensdauer Null wird. Verwenden Sie umgekehrt eine nicht besessene Referenz, wenn Sie wissen, dass die Referenz niemals Null sein wird, wenn sie während der Initialisierung festgelegt wurde.
In den Dokumenten finden Sie einige Beispiele, in denen die Aufbewahrungszyklen und deren Unterbrechung erläutert werden. Alle diese Beispiele werden aus den Dokumenten extrahiert .
Beispiel für das weakSchlüsselwort:
class Person {
let name: String
init(name: String) { self.name = name }
var apartment: Apartment?
}
class Apartment {
let number: Int
init(number: Int) { self.number = number }
weak var tenant: Person?
}
Und jetzt zu einigen ASCII-Grafiken (Sie sollten sich die Dokumente ansehen - sie haben hübsche Diagramme):
Person ===(strong)==> Apartment
Person <==(weak)===== Apartment
Das Beispiel Personund Apartmentzeigt eine Situation, in der zwei Eigenschaften, die beide gleich Null sein dürfen, möglicherweise einen starken Referenzzyklus verursachen. Dieses Szenario lässt sich am besten mit einer schwachen Referenz lösen. Beide Entitäten können existieren, ohne eine strikte Abhängigkeit voneinander zu haben.
Beispiel für das unownedSchlüsselwort:
class Customer {
let name: String
var card: CreditCard?
init(name: String) { self.name = name }
}
class CreditCard {
let number: UInt64
unowned let customer: Customer
init(number: UInt64, customer: Customer) { self.number = number; self.customer = customer }
}
In diesem Beispiel kann a ein Customerhaben oder nicht CreditCard, aber a CreditCard wird immer mit a verknüpft Customer. Um dies darzustellen, verfügt die CustomerKlasse über eine optionale cardEigenschaft, die CreditCardKlasse jedoch über eine nicht optionale (und nicht besessene) customerEigenschaft.
Customer ===(strong)==> CreditCard
Customer <==(unowned)== CreditCard
Das Beispiel Customerund CreditCardzeigt eine Situation, in der eine Eigenschaft, die Null sein darf, und eine andere Eigenschaft, die nicht Null sein darf, möglicherweise einen starken Referenzzyklus verursachen. Dieses Szenario lässt sich am besten mit einer nicht besessenen Referenz lösen.
Anmerkung von Apple:
Schwache Referenzen müssen als Variablen deklariert werden, um anzuzeigen, dass sich ihr Wert zur Laufzeit ändern kann. Eine schwache Referenz kann nicht als Konstante deklariert werden.
Es gibt auch ein drittes Szenario, in dem beide Eigenschaften immer einen Wert haben sollten und keine Eigenschaft nach Abschluss der Initialisierung jemals Null sein sollte.
Außerdem gibt es die klassischen Szenarien für den Beibehaltungszyklus, die beim Arbeiten mit Verschlüssen vermieden werden sollten.
Zu diesem Zweck empfehle ich Ihnen, die Apple-Dokumente zu besuchen oder das Buch zu lesen .