I cicli non sono male, ma vengono spesso evitati perché possono complicare la verifica della mancanza di perdite di memoria. Le perdite si verificano soprattutto quando gli oggetti sono "conteggiati di riferimento". In una lingua o in un sistema che utilizza il conteggio dei riferimenti, un oggetto tiene traccia del numero di riferimenti che puntano su di esso. Ogni volta che viene cancellato un riferimento, il conteggio diminuisce, quando il conteggio arriva a zero, non ci sono riferimenti e quindi l'oggetto può essere cancellato.
Questo di solito si prende cura di se stesso e funziona bene senza alcun pensiero attento. Se hai un gruppo di oggetti senza cicli e trascini il tuo riferimento all'oggetto radice, allora sarà cancellato, questo significa che i riferimenti agli oggetti che possiede saranno eliminati, gli oggetti a cui si fa riferimento avranno i loro riferimenti andare a zero. Verranno cancellati e la cascata farà sì che tutti gli oggetti vengano cancellati.
Ma ... se si dispone di un ciclo, questa cascata non funziona. Potresti avere un gruppo di oggetti e non li vuoi più, quindi fai cadere l'unico riferimento che hai a questi oggetti, ma poiché c'è un ciclo gli oggetti si richiamano l'un l'altro. Ciò significa che i loro conteggi di riferimento non vanno mai a zero e non vengono eliminati. Questa è una perdita di memoria.
Chiaramente, è possibile eseguire una gestione attenta e interrompere i cicli prima di rilasciare il riferimento a un gruppo di oggetti che non si desidera più. Ma ... come ho appena detto, questo richiede un'attenta gestione. È molto facile sbagliare. Questo è uno dei motivi principali per cui si verificano perdite di memoria.
Per evitare il rischio di perdite e il difficile processo di interruzione dei cicli correttamente quando non è più necessario un gruppo di oggetti, i programmatori di solito cercano di evitare i cicli. Questo diventa più importante nei grandi progetti con molti programmatori in cui nessuno capisce l'intero sistema. Se ci fossero dei cicli, i programmatori dovrebbero stare attenti e trascorrere molto tempo studiando l'altro codice per evitare i cicli.
Alcune lingue con i garbage collector (ad esempio C#) possono eliminare un gruppo di oggetti che non sono più necessari anche se il gruppo contiene cicli.
fonte
2009-04-26 18:50:22
Il garbage collector Objective-C (se abilitato) può anche eliminare i gruppi di loop di conservazione (quasi tutti i garbage collector possono) ma questo non è rilevante su iPhone, dove la garbage collection di Objective-C non è supportata. –