Sia weak
e unowned
riferimenti non creare una strong
presa sull'oggetto di cui (aka non aumentano il conteggio conservano al fine di evitare ARC dal deallocando l'oggetto di cui).
Ma perché due parole chiave? Questa distinzione ha a che fare con il fatto che i Optional
tipi sono integrati nel linguaggio Swift. Per farla breve: i tipi opzionali offrono sicurezza della memoria (questo funziona magnificamente con le regole del costruttore di Swift - che sono rigorose per fornire questo vantaggio).
Un weak
riferimento ne consente la possibilitànil
(ciò si verifica automaticamente quando l'oggetto referenziato viene deallocato), pertanto il tipo di proprietà deve essere facoltativo, pertanto l'utente, in quanto programmatore, è tenuto a verificarlo prima di utilizzarlo (sostanzialmente il compilatore ti costringe, per quanto possibile, a scrivere un codice sicuro).
Un unowned
riferimento presume che non diventerà mai nil
durante la sua vita. È necessario impostare un riferimento non noto durante l'inizializzazione; ciò significa che il riferimento verrà definito come un tipo non opzionale che può essere utilizzato in modo sicuro senza controlli. Se in qualche modo l'oggetto a cui viene fatto riferimento è deallocato, l'app andrà in crash quando verrà utilizzato il riferimento non proprietario.
Dai documenti Apple :
Utilizzare un riferimento debole ogni volta che è valido affinché quel riferimento diventi nullo ad un certo punto durante la sua vita. Al contrario, utilizzare un riferimento non noto quando si sa che il riferimento non sarà mai zero dopo che è stato impostato durante l'inizializzazione.
Nei documenti, ci sono alcuni esempi che discutono dei cicli di mantenimento e di come interromperli. Tutti questi esempi sono estratti dai documenti .
Esempio della weak
parola chiave:
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?
}
E ora, per alcune opere ASCII (dovresti andare a vedere i documenti - hanno dei diagrammi carini):
Person ===(strong)==> Apartment
Person <==(weak)===== Apartment
Il Person
eApartment
esempio mostra una situazione in cui due proprietà, entrambe le quali possono essere nulle, hanno il potenziale per causare un forte ciclo di riferimento. Questo scenario è meglio risolto con un riferimento debole. Entrambe le entità possono esistere senza avere una stretta dipendenza dall'altra.
Esempio della unowned
parola chiave:
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 questo esempio, a Customer
può o meno avere a CreditCard
, ma a CreditCard
sarà sempre associato a Customer
. Per rappresentarlo, la Customer
classe ha una card
proprietà opzionale , ma la CreditCard
classe ha una proprietà non opzionale (e non posseduta) customer
.
Customer ===(strong)==> CreditCard
Customer <==(unowned)== CreditCard
L' esempio Customer
e CreditCard
mostra una situazione in cui una proprietà che può essere nulla e un'altra proprietà che non può essere nulla ha il potenziale per causare un forte ciclo di riferimento. Questo scenario viene risolto al meglio con un riferimento sconosciuto.
Nota di Apple:
I riferimenti deboli devono essere dichiarati come variabili, per indicare che il loro valore può cambiare in fase di esecuzione. Un riferimento debole non può essere dichiarato come costante.
Esiste anche un terzo scenario in cui entrambe le proprietà dovrebbero sempre avere un valore e nessuna proprietà dovrebbe mai essere nulla una volta completata l'inizializzazione.
E ci sono anche i classici scenari del ciclo di conservazione da evitare quando si lavora con le chiusure.
Per questo, ti incoraggio a visitare i documenti Apple o a leggere il libro .