Una pantalla de tu app iOS no libera memoria al cerrarse: Instruments muestra que los view controllers se acumulan. ¿Cómo diagnosticas y resuelves la fuga?
Contexto
App con closures que capturan self (handlers de red, timers, delegados), Combine con suscripciones y algún delegado declarado como strong. El uso de memoria sube cada vez que el usuario entra y sale de la pantalla.
Respuesta modelo
Es un retain cycle. 1) Confirmar con el Memory Graph Debugger y las plantillas Leaks/Allocations de Instruments qué objeto retiene al view controller. 2) En closures que capturan self, usar [weak self] (o [unowned self] solo si la vida está garantizada) y hacer guard let self. 3) Los delegados deben declararse weak var. 4) En Combine, guardar las suscripciones en un Set<AnyCancellable> propiedad del objeto para que se cancelen al desasignarse; evitar capturar self fuerte en los sink. 5) Invalidar los Timer en deinit o al desaparecer. 6) Verificar añadiendo un print en deinit y confirmando que se llama al cerrar la pantalla.
Claves
- Memory Graph Debugger + Instruments para localizar quién retiene.
- [weak self] en closures y weak var en delegados rompe el ciclo.
- deinit con print confirma que el objeto se libera.