Puede tomar el lenguaje conocido como Swift y cambiarle el nombre a "Swift with ARC". Luego, podría crear un nuevo lenguaje llamado "Swift con GC" con exactamente la misma sintaxis, pero con menos garantías sobre cuándo se desasignan los objetos.
En Swift con ARC, una vez que el recuento de referencia es 0, el objeto irá. Con la recolección de basura, siempre que tenga una referencia débil, puede asignar esa referencia débil a una referencia fuerte para "recuperar" el objeto. (En Swift, una vez que el recuento de referencias es 0, las referencias débiles son nulas); Esa es una gran diferencia.
Y, por supuesto, Swift con ARC garantiza que matar el último recuento de referencias desasignará el objeto de inmediato. Por ejemplo, puede tener una clase FileWriter, donde no se le permite tener dos instancias que escriban en el mismo archivo al mismo tiempo. En Swift con ARC se podría decir oldWriter = nil; newWriter = FileWriter (...) y sabría que el nuevo FileWriter solo se crea después de eliminar el anterior (a menos que haya guardado otra referencia); en Swift con GC esto no funcionaría.
Otra diferencia es que en "Swift with ARC", los objetos a los que solo se hace referencia a través de fuertes ciclos de referencia, pero que en realidad no son accesibles, se garantiza que no se desasignen.
deinit
una palabra clave y su semántica asociada son, de hecho, las cosas que ponen el recuento de referencias directamente en el lenguaje, en lugar de la implementación, en el ámbito.