Sowohl weak
als auch unowned
Referenzen erzeugen keinen strong
Halt 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 Optional
Typen 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 weak
Referenz 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 unowned
Referenz geht davon aus, dass es zu nil
Lebzeiten 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 weak
Schlü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 Person
und Apartment
zeigt 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 unowned
Schlü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 Customer
haben oder nicht CreditCard
, aber a CreditCard
wird immer mit a verknüpft Customer
. Um dies darzustellen, verfügt die Customer
Klasse über eine optionale card
Eigenschaft, die CreditCard
Klasse jedoch über eine nicht optionale (und nicht besessene) customer
Eigenschaft.
Customer ===(strong)==> CreditCard
Customer <==(unowned)== CreditCard
Das Beispiel Customer
und CreditCard
zeigt 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 .