Swift Academy · Lección

Ciclos de retención: causas y detección

Identifique ciclos de retención entre objetos y closures mediante Instruments.

Lección 2 de 412 pasos

Ciclos de retención: causas y detección es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Swift Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Swift Academy incluye 4 lecciones en total.

Bienvenida

Un ciclo de retención ocurre cuando dos o más objetos mantienen referencias strong entre sí, lo que impide que ARC llegue a un contador de cero y provoca una fuga de memoria.

Ciclo simple entre dos objetos

```swift class Owner { var pet: Pet? } class Pet { var owner: Owner? } var o: Owner? = Owner() var p: Pet? = Pet() o?.pet = p // Owner → Pet (strong) p?.owner = o // Pet → Owner (strong) o = nil; p = nil // Neither deinit called — cycle! ```

Ciclo entre padre e hijo

```swift class Node { var children: [Node] = [] var parent: Node? // strong → cycle with parent } let root = Node() let child = Node() root.children.append(child) child.parent = root // cycle ```

Ciclo de captura de un closure

```swift class ViewController { var onComplete: (() -> Void)? func setup() { onComplete = { // closure strongly captures self self.doWork() // ← cycle! } } } ```

Ciclo en el patrón Delegate

```swift protocol TaskDelegate: AnyObject { func didFinish() } class Task { var delegate: TaskDelegate? // if strong → potential cycle } class Manager: TaskDelegate { var task = Task() init() { task.delegate = self } // Manager → Task → Manager } ```

Detección con Instruments

Use Xcode Instruments → Leaks: 1. Ejecute la aplicación en Instruments 2. Haga clic en el instrumento Leaks 3. Las marcas rojas indican objetos filtrados 4. Examine los detalles para ver el grafo de referencias Como alternativa, establezca `deinit { print(...) }` y compruebe si se ejecuta.

Detección con Xcode Memory Graph

En el depurador de Xcode: Debug > Memory Graph Debugger. Haga clic en un objeto filtrado para ver su cadena de referencias; el ciclo aparecerá como un bucle cerrado en el grafo.

Patrones habituales de ciclos

• Un delegate que almacena otro delegate mediante una referencia strong • Un closure que captura `self` mediante una referencia strong • Referencias strong bidireccionales entre padre e hijo • Un observador de NotificationCenter que mantiene un closure que captura self • El target de un Timer es `self` (strong)

Ciclo de retención de Timer

```swift class Poller { var timer: Timer? func start() { timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] _ in self?.poll() // weak self breaks cycle } } deinit { timer?.invalidate() } } ```

Ciclo de NotificationCenter

```swift class Listener { var token: NSObjectProtocol? init() { token = NotificationCenter.default.addObserver(forName: .UIApplicationDidBecomeActive, object: nil, queue: .main) { [weak self] _ in self?.refresh() } } deinit { NotificationCenter.default.removeObserver(token!) } } ```

Comprobación rápida

¿Qué es un ciclo de retención en ARC?

Resumen

Puntos clave: • Ciclos de retención: referencias strong mutuas → ninguno de los objetos se desasigna • Comunes en: delegates, closures y vínculos bidireccionales entre padre e hijo • Detectarlos con Instruments Leaks o Xcode Memory Graph Debugger • Solucionarlos con referencias `weak` o `unowned` • Los temporizadores y NotificationCenter también pueden causar ciclos: rómpalos con `[weak self]` Siguiente tema: referencias weak y unowned.
Gratis para empezar

Aprende Swift con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
122
Lecciones
409

Preguntas frecuentes

¿La lección «Ciclos de retención: causas y detección» es gratis?

Sí — el texto completo de «Ciclos de retención: causas y detección» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Swift Academy, actualiza a CoddyKit PRO. El curso de Swift Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Ciclos de retención: causas y detección»?

Identifique ciclos de retención entre objetos y closures mediante Instruments. Practicas Swift Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Swift Academy?

No se requiere experiencia previa. Swift Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Ciclos de retención: causas y detección»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Swift Academy?

Sí. Cada lección de Swift Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Cómo ARC cuenta las referencias
  2. Ciclos de retención: causas y detección
  3. Referencias weak y unowned
  4. Listas de captura de closures y [weak self]
← Volver a Swift Academy