Sia weake unownedriferimenti non creare una strongpresa 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 Optionaltipi 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 weakriferimento 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 unownedriferimento presume che non diventerà mai nildurante 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 weakparola 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 PersoneApartment 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 unownedparola 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 Customerpuò o meno avere a CreditCard, ma a CreditCard sarà sempre associato a Customer. Per rappresentarlo, la Customerclasse ha una cardproprietà opzionale , ma la CreditCardclasse ha una proprietà non opzionale (e non posseduta) customer.
Customer ===(strong)==> CreditCard
Customer <==(unowned)== CreditCard
L' esempio Customere CreditCardmostra 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 .