Los ciclos no son malos, pero a menudo se evitan porque pueden dificultar el aseguramiento de que no haya pérdidas de memoria. Las fugas ocurren especialmente cuando los objetos son 'contados por referencia'. En un idioma o sistema que utiliza el recuento de referencias, un objeto realiza un seguimiento del número de referencias que lo señalan. Cada vez que se borra una referencia, el conteo disminuye, cuando el recuento llega a cero, no hay referencias y, por lo tanto, el objeto se puede eliminar.
Esto generalmente se soluciona solo y funciona bien sin pensarlo cuidadosamente. Si tiene un grupo de objetos sin ciclos y deja caer su referencia al objeto raíz, se eliminará, esto significa que se eliminarán las referencias que tiene a los objetos que posee, los objetos a los que se hará referencia tendrán sus recuentos de referencia ir a cero. Se eliminarán y la cascada hará que se eliminen todos los objetos.
Pero ... si tiene un ciclo, esta cascada no funciona. Puede tener un grupo de objetos y ya no los quiere, por lo que deja caer la única referencia que tiene a estos objetos, pero como hay un ciclo, los objetos se referencian entre sí. Esto significa que sus recuentos de referencia nunca pasan a cero, y no se eliminan. Esta es una pérdida de memoria.
Claramente, puede hacer una gestión cuidadosa y romper los ciclos antes de soltar su referencia a un grupo de objetos que ya no desea. Pero ... como acabo de decir, esto requiere una administración cuidadosa. Es muy fácil equivocarse. Esta es una de las razones principales por las que se producen fugas de memoria.
Para evitar el riesgo de fugas y la complicada tarea de romper los ciclos correctamente cuando ya no necesita un grupo de objetos, los programadores generalmente intentan evitar los ciclos. Esto se vuelve más importante en grandes proyectos con muchos programadores donde nadie entiende todo el sistema. Si hubiera ciclos, los programadores tendrían que tener cuidado y pasar mucho tiempo estudiando el código de los demás para evitar ciclos.
Algunos lenguajes con recolectores de basura (por ejemplo, C#) pueden eliminar un grupo de objetos que ya no se necesitan aunque el grupo contenga ciclos.
El recolector de basura de Objective-C (cuando está habilitado) también puede eliminar grupos de retención de bucles (casi cualquier recolector de basura) pero esto no es relevante en el iPhone, donde la recolección de basura de Objective-C no es compatible. –