2014-10-31 13 views
7

scusa se si tratta di una domanda stupida. Ho appena iniziato a imparare velocemente. Io uso principalmente php per il mio lavoro quotidiano. Swift libro di testo di Apple Store utilizza il seguente esempio (ho modificato in una versione più breve) per dimostrare l'utilizzo di riferimenti deboli:Perché Swift non dispone automaticamente riferimenti circolari (cicli di riferimento forti)

class Person { 
    var apartment: Apartment?; 
} 

class Apartment { 
    weak var tenant: Person?; 
} 

var john: Person?;   john = Person(); 
var number73: Apartment?; number73 = Apartment(); 
john!.apartment = number73; number73!.tenant = john;  //circular reference here 

john = nil; number73 = nil;   //deference from static variable names 

Nella definizione Apartment classe superiore, se i deboli parola chiave viene rimossa da ten tenant, crea un forte ciclo di riferimento nel seguente codice in modo che le due istanze non vengano eliminate da GC. Tuttavia, mi sembra che il GC non abbia realmente bisogno dell'indicazione del riferimento debole. È ovvio che le due istanze non possono essere collegate da alcuna variabile nello scope corrente o da qualsiasi variabile statica, quindi sono sicure da smaltire.

Perché dosare Swift forzare la sintassi? L'unico vantaggio che riesco a capire è che la parola chiave debole evidenzia la logica in modo che il codice sia più facile da leggere.

risposta

13

Swift non utilizza la garbage collection mark-and-sweep. Usa il conteggio dei riferimenti. Nel conteggio dei riferimenti viene contato il numero di riferimenti a ciascun oggetto: ogni volta che viene creato un nuovo riferimento a un oggetto, il conteggio dei riferimenti viene incrementato e ogni volta che viene rimosso un riferimento all'oggetto, il conteggio dei riferimenti viene decrementato. Non appena un oggetto ha zero riferimenti, viene eliminato. Uno dei principali punti deboli del conteggio dei riferimenti è che le strutture cicliche non sono smaltite.

Nel proprio esempio, john ha un riferimento a number73 e number73 ha un riferimento a john. Quindi, se la parola chiave weak viene rimossa, ogni oggetto ha almeno un riferimento e quindi nessuno degli oggetti verrà eliminato.

I riferimenti deboli aiutano a rompere i cicli. Fondamentalmente, i riferimenti deboli non vengono contati, e quindi gli oggetti che hanno solo riferimenti deboli ad essi verranno rimossi. Nell'esempio, poiché l'istanza Apartment ha solo un riferimento debole all'istanza Person, quest'ultima ha un conteggio di riferimento pari a 0 e verrà eliminata. Dopodiché, anche l'istanza Apartment ha un conteggio di riferimento pari a 0 e verrà eliminata.

+0

"Swift non utilizza la garbage collection mark-and-sweep, utilizza il conteggio dei riferimenti" fornisce la spiegazione. –