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 deinitCiclo 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 stronglyRomper 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 cycleLista 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
- Fundamentos de ARC: strong / weak / unowned
- Ciclos de retenção e como rompê-los com weak/unowned
- Tipos de valor para reduzir o compartilhamento