Perché non funziona in modo strettamente basato sul conteggio dei riferimenti.
Considerare riferimenti circolari che non sono più raggiungibili dalla "radice" dell'applicazione.
Ad esempio:
APP
ha un riferimento SOME_SCREEN
SOME_SCREEN
ha un riferimento SOME_CHILD
SOME_CHILD
ha un riferimento SOME_SCREEN
ora, APP
gocce è riferimento SOME_SCREEN
.
In questo caso, SOME_SCREEN
ha ancora un riferimento a SOME_CHILD
, e SOME_CHILD
ha ancora un riferimento alla SOME_SCREEN
- quindi, in questo caso, il tuo esempio non funziona.
Ora, altri (Apple con ARC, Microsoft con COM, molti altri) hanno soluzioni per questo e funzionano in modo più simile al modo in cui lo descrivete.
Con ARC è necessario annotare i propri riferimenti con parole chiave come strong
e weak
per consentire a ARC di sapere come gestire questi riferimenti (ed evitare riferimenti circolari) ... (non leggere troppo nel mio specifico esempio con ARC poiché ARC gestisce queste cose in anticipo durante il processo di compilazione e non richiede uno specifico runtime per sé), quindi può sicuramente essere fatto in modo simile a come lo descrivi, ma non è fattibile con alcune delle funzionalità di Giava. Credo inoltre che la COM funzioni in modo più simile a come la descrivi ... ma, ancora una volta, ciò non è privo di una certa considerazione da parte dello sviluppatore.
In realtà, nessun sistema di conteggio di riferimento "semplice" potrebbe mai essere praticabile senza una certa quantità di pensiero dallo sviluppatore dell'applicazione (per evitare i riferimenti circolari, ecc)
+1 Vale anche la pena ricordare che i counter counter atomici per i programmi multithread sono ancora più costosi. –
Una discussione di questo è incompleta senza menzionare la pausa GC. –