Retain Cycle

Одной из распространенных проблем, связанных с управлением памятью, является проблема Retain Cycle или цикл сильных ссылок.

Retain Cycle — когда сущность A обладает сущностью B и наоборот.

Retain Cycle

Утечка памяти происходит, когда содержимое остается в памяти даже после окончания его жизненного цикла. Это случается, когда два объекта имеют strong ссылки друг на друга. В подобном случае Swift просто не может решить, какую из ссылок можно уничтожить, а какую нет. В результате все объекты владеют взаимными ссылками и не удаляются.

В примере ниже оба экземпляра будут жить до тех пор, пока программа не завершится. Это цикл сильных ссылок.

class A { var b: B? = nil }
class B { var a: A? = nil }

let a = A()
let b = B()

a.b = b  // a retains b
b.a = a  // b retains a -- a reference cycle

Как исправить цикл сильных ссылок?

Сделайте одну из ссылок weak или unowned.

class B { weak var a: A? = nil }

Слабая ссылка не увеличивает счетчик ссылок. Слабые ссылки всегда объявляются как необязательные (optional) типы. Когда счетчик ссылок становится равным нулю, объект автоматически будет деаллоцирован.

Подробнее о проблеме Retain Cycle можно ознакомиться здесь:

Выразить благодарность или найти уникальный материал вы можете в boosty.

Подписывайтесь на мой Telegram-канал iOS Interview Channel, чтобы не пропустить новый материал.


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *