Циклы удержания предотвращаются путем правильного использования слабых (weak) или безусловных неудерживающих (unowned) ссылок.
Слабые ссылки (weak):
nil).swift
Безусловные неудерживающие ссылки (unowned):
self в классе, где замыкание явно "принадлежит" экземпляру класса). При доступе к unowned ссылке, если объект уже освобожден, происходит ошибка времени выполнения.swift
Использование в замыканиях:
Замыкания могут вызывать циклы удержания, если захватывают экземпляры классов по сильной ссылке, и этот экземпляр класса также содержит сильную ссылку на замыкание. Для предотвращения используются списки захвата (capture lists) в начале замыкания:
swift
Выбор между weak и unowned зависит от семантики отношений между объектами:
weak: когда ссылка может стать nil в течение жизненного цикла объекта, на который ссылаются.unowned: когда объект, на который ссылаются, гарантированно существует дольше или столько же, сколько объект, который на него ссылается, и ссылка никогда не станет nil.