Одной из распространенных проблем, связанных с управлением памятью, является проблема 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 можно ознакомиться здесь:
- Управление памятью в Swift
- Жизненный цикл объекта в Swift
- Списки захвата в Swift: в чём разница между ссылками weak, strong и unowned?
- Avoiding retain cycles in Swift
- STRONG UNOWNED WEAK — В чем разница?
- Управление памятью
- Что такое ARC(Automatic Reference Counting)?
Выразить благодарность или найти уникальный материал вы можете в boosty.
Подписывайтесь на мой Telegram-канал iOS Interview Channel, чтобы не пропустить новый материал.