39. Что такое retain cycle?Теория
Дополнительные вопросы
1. Как два экземпляра класса могут создать retain cycle?
2. Как замыкание может создать retain cycle?
3. Как разорвать retain cycle?
1. Как два экземпляра класса могут создать retain cycle?
2. Как замыкание может создать retain cycle?
3. Как разорвать retain cycle?
Retain cycle это круг сильных ссылок. У каждого участника счётчик больше нуля, потому что его держит сосед по кругу. ARC такие объекты не освобождает, deinit не вызывается.
1. Два класса держат друг друга сильно: родитель и ребёнок, делегат, который на самом деле не weak. Пока жива одна ссылка снаружи, живы оба. Когда внешняя пропала, они держат друг друга сами.
2. Объект сильно хранит замыкание, а замыкание сильно захватывает self. Типичный случай: self.handler = { self.reload() }. Круг замыкается на объекте.
3. Одну из ссылок делают не сильной. У делегата это weak. У замыкания список захвата [weak self] или [unowned self], если объект точно переживёт замыкание. Достаточно разорвать одно ребро круга.