0Pricing
Swift Academy · Aula

Ciclos de retenção e como rompê-los com weak/unowned

Identifique ciclos de retenção entre objetos e closures e rompa-os com segurança usando referências weak e unowned .

Ciclos de retenção e como rompê-los com weak/unowned é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 2 de 3. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Swift Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Swift Academy inclui 3 aulas no total.

O que é um ciclo de retenção?

Um ciclo de retenção ocorre quando objetos (ou fechamentos) mantêm referências fortes uns aos outros, de modo que o ARC nunca chega a zero. Rompa os ciclos com fraca ou não proprietária.

Ciclo objeto ↔ objeto

Duas referências fortes em sentidos opostos criam um vazamento: nenhum dos objetos consegue chegar a zero.

final class Owner {
    var gadget: Gadget?
    deinit { print("Owner deinit") }
}
final class Gadget {
    var owner: Owner?
    deinit { print("Gadget deinit") }
}
// Strong ⇄ strong (cycle)
var o: Owner? = Owner()
var g: Gadget? = Gadget()
o!.gadget = g
g!.owner = o
o = nil      // no deinit
g = nil      // still no deinit (leak)

Romper com fraca

Torne um dos lados fraco (geralmente a referência de retorno, como delegado/owner) para permitir que o ARC libere ambos.

final class Owner2 {
    var gadget: Gadget2?
    deinit { print("Owner2 deinit") }
}
final class Gadget2 {
    weak var owner: Owner2?   // weak breaks cycle; becomes nil automatically
    deinit { print("Gadget2 deinit") }
}
var o2: Owner2? = Owner2()
var g2: Gadget2? = Gadget2()
o2!.gadget = g2
g2!.owner = o2
o2 = nil     // Owner2 deinit
g2 = nil     // Gadget2 deinit

Ciclo de fechamento (self forte)

Fechamentos capturam variáveis fortemente por padrão. Se o objeto também possuir o fechamento, isso formará um ciclo.

final class TimerClient {
    var tick: (() -> Void)?
    deinit { print("TimerClient deinit") }
    func start() {
        // BAD: closure strongly captures self; self keeps tick strongly
        tick = {
            print("tick from", self) // strong capture of self
        }
    }
}
var c: TimerClient? = TimerClient()
c!.start()
c = nil   // no deinit — closure holds self strongly

Romper com listas de captura

Use [weak self] (opcional) para uma limpeza segura; use [unowned self] somente se for garantido que self estará vivo quando o fechamento for executado.

final class TimerClient2 {
    var tick: (() -> Void)?
    deinit { print("TimerClient2 deinit") }
    func start() {
        // Use [weak self] when self can go away before tick runs
        tick = { [weak self] in
            guard let self = self else { return } // safe unwrap
            print("tick from", self)
        }
        // Alternative when lifetime is guaranteed: [unowned self]
        // tick = { [unowned self] in print("tick from", self) }
    }
}
var c2: TimerClient2? = TimerClient2()
c2!.start()
c2 = nil   // deinit now prints — no cycle

Lista de verificação

Lista de verificação:

  • Há referências nos dois sentidos? Torne um dos lados fraco (por exemplo, um delegado).
  • Há fechamentos armazenados em um tipo? Capture [weak self] e desembrulhe com segurança.
  • Use [unowned self] somente quando o tempo de vida for garantido; caso contrário, isso poderá causar uma falha.

Fraca versus não proprietária em fechamentos

Verificação rápida: qual lista de captura é mais segura quando o objeto pode ser liberado?

Recapitulação

Recapitulação: identifique ciclos em objetos e fechamentos. Rompa-os com fraca ou não proprietária, conforme apropriado; prefira fraca quando estiver em dúvida.

Perguntas Frequentes

A aula “Ciclos de retenção e como rompê-los com weak/unowned” é grátis?

Sim — o texto completo de “Ciclos de retenção e como rompê-los com weak/unowned” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Swift Academy, atualize para CoddyKit PRO. O curso de Swift Academy inclui 3 aulas no total.

O que vou aprender em “Ciclos de retenção e como rompê-los com weak/unowned”?

Identifique ciclos de retenção entre objetos e closures e rompa-os com segurança usando referências weak e unowned . Você pratica Swift Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Swift Academy?

Nenhuma experiência prévia é necessária. Swift Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 3.

Quanto tempo leva a aula “Ciclos de retenção e como rompê-los com weak/unowned”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Swift Academy?

Sim. Cada aula de Swift Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Fundamentos de ARC: strong / weak / unowned
  2. Ciclos de retenção e como rompê-los com weak/unowned
  3. Tipos de valor para reduzir o compartilhamento
← Voltar para Swift Academy