A veces escuchamos "Swift no hace GC (rastreo) clásico, usa ARC".
Pero no estoy seguro de si hay algo en la semántica de Swift que requiera un recuento de referencias. Parece que uno podría construir su propio compilador Swift y tiempo de ejecución para usar GC de rastreo.
Entonces, ¿qué es exactamente "referencia contada" sobre Swift? ¿La implementación de Apple o el lenguaje en sí? ¿Hay partes del lenguaje o de la biblioteca que soportan ARC con tanta fuerza que podemos usar esa etiqueta para el lenguaje en sí?
fuente
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.chi ha respondido a la pregunta específica en el cuerpo sobre swift, esta respuesta responde a la pregunta más general en el título.
El GC de conteo de referencias y el GC de rastreo proporcionan al programador diferentes garantías.
El recuento de referencias proporciona determinismo en la ubicación del flujo del programa donde se destruye un objeto, que puede ser importante si el objeto posee recursos escasos que deben liberarse rápidamente. Por otro lado, no puede lidiar con ciclos de referencias "fuertes".
Depende de la especificación de un idioma individual si se garantiza alguna característica y, por lo tanto, qué opciones están disponibles para una implementación compatible.
fuente
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.
fuente