A diferencia de otros lenguajes como Java o Kotlin, Swift no tiene un recolector de basura. En su lugar, utiliza una técnica mucho mås råpida denominada Automatic Reference Counting (ARC).
En la mayorĂa de los casos, esto significa que no tenemos que preocuparnos del manejo de memoria en Swift. Simplemente funciona, como si de un recolector de basura se tratase. Es decir, ARC swift liberarĂĄ automĂĄticamente la memoria utilizada por una clase cuando Ă©sta no vaya a ser utilizada nunca mĂĄs.
ÂżCĂłmo sabe ARC si puede liberar la memoria utilizada por una instancia?
Muy simple: ARC lleva la cuenta de cuĂĄntas propiedades, constantes o variables apuntan hacia una instancia.
Cada vez que asignamos una variable a una instancia de una clase, la cuenta de referencias (a partir de ahora,<strong>retainCount</strong>
) aumenta en +1. Si asignamos la misma instancia a 3 variables diferentes, su cuenta de referencias serĂĄ 3. ÂżFĂĄcil, no?
var myVariable1: SomeObject = SomeObject()
var myVariable2 = myVariable1
var myVariable3 = myVariable1
SĂłlo cuando esa cuenta de referencias (<strong>retainCount</strong>
) baje hasta cero, ARC considerarĂĄ que esa instancia nunca se va a volver a utilizar y se puede eliminar de memoria.
đ OJO: Cuando intentas acceder a una instancia de una clase que ya ha sido eliminada de memoria, se produce un crash en tu aplicaciĂłn.
Manos al teclado : Xcode
1) Aumentando la cuenta de referencias
Supongamos que tenemos una clase <strong>Author</strong>
que representa a un escritor de libros:
class Author {
// MARK: Properties
let name: String
// MARK: Initialization
init(name: String) {
self.name = name
}
deinit {
print(âAuthor called \(name) is being deinitialized")
}
}
La clase <strong>Author</strong>
tiene un método <strong>init</strong>
para crear el objeto y un método <strong>deinit</strong>
que se va a ejecutar cuando la instancia se vaya a eliminar de memoria.
Vamos a crear ahora una variable de tipo <strong>Author?</strong>
para poder asignarla a <strong>nil</strong>
o a una instancia de tipo <strong>Author</strong>
.
var author1: Author? = Author(name: âGeorge R. R. Martinâ)
En estos momentos, se crea una referencia fuerte (<strong>strong</strong>
reference) entre el sĂmbolo <strong>author1</strong>
y la instancia de tipo <strong>Author</strong>
. Se llama referencia fuerte (strong
) porque aumenta en +1 la cuenta de referencias de la instancia.
Object | retainCount |
Author | 1 |
Vamos a crear ahora otras dos variables y asignarle el mismo objeto al que apunta <strong>author1</strong>
:
var author2 = author1
var author3 = author1
Con cada nueva asignaciĂłn, se estĂĄ creando una nueva referencia fuerte, que suma +1 a la cuenta de referencias total, que ahora mismo es igual a 3.
Object | <strong>retainCount</strong> |
Author | 3 |
2) Decrementando la cuenta de referencias
Ahora vamos a hacer lo contrario.
Vamos a ir decrementando la cuenta de referencias (<strong>retainCount</strong>
) de la instancia. Esto lo podemos conseguir asignando alguna de las variables a <strong>nil</strong>
:
author1 = nil
author2 = nil
Cada vez que hacemos esto, la cuenta de referencias disminuye en uno.
Object | <strong>retainCount</strong> |
Author | 1 |
Recuerda que ARC en iOS sĂłlo liberarĂĄ la memoria utilizada por la instancia cuando su cuenta de referencias llegue a cero. Ahora mismo, sigue siendo igual a 1, porque todavĂa podemos acceder a ella a travĂ©s de <strong>author3</strong>
.
Vamos a hacer que llegue a cero asignando <strong>author3</strong>
también a <strong>nil</strong>
:
author3 = nil
// Se imprime por pantalla:
// âAuthor called George R. R. Martin is being deinitialized"
FĂjate cĂłmo se ejecuta el cĂłdigo dentro de <strong>deinit</strong>
. Esto quiere decir que ARC ha liberado la memoria utilizada por esta instancia, ya que su cuenta de referencias fuertes ha llegado a cero. O dicho de otro modo, ya no quedan referencias fuertes (strong
) apuntando a la instancia, y por tanto, es seguro eliminarlo.
Ănete a la newsletter para no perderte ningĂșn nuevo tutorial: recibe un email cuando se publiquen nuevos artĂculos o vĂdeos y no pierdas la oportunidad de seguir aprendiendo.
ConclusiĂłn
Aunque Swift no tiene un recolector de basura, utiliza otra técnica llamada ARC que consiste en llevar la cuenta de referencias fuertes que apuntan hacia una instancia.
Esto es mucho mĂĄs rĂĄpido que cualquier otra tĂ©cnica y nos permite olvidarnos, en la mayorĂa de las ocasiones, del manejo de memoria en Swift.
Pero existen ocasiones en las que le tenemos que echar una mano a nuestro amigo ARC en Swift. En el prĂłximo artĂculo te cuento uno de ellos.
Mientras tanto, si te ha gustado lo que has leĂdo, te invito a subscribirte a la comunidad de alexandrefreire.com y compartir en redes sociales.