Retain cycle (цикл удержания) происходит, когда два или более объекта держат сильные ссылки друг на друга, что препятствует ARC (Automatic Reference Counting) освободить эти объекты. Это приводит к утечкам памяти.
self сильно, а self в свою очередь держит ссылку на это замыканиеИспользуй weak или unowned ссылки, чтобы разорвать цикл:
Delegates — объяви свойство delegate как weak:
weak var delegate: SomeDelegate?
Замыкания — используй capture list с [weak self] или [unowned self]:
someclosure = { [weak self] in
self?.doSomething()
}
weak и unownedweak, когда объект может стать nil в течение жизни замыкания — тогда ссылка будет optionalunowned, когда объект никогда не будет nil, пока замыкание живо — тогда ссылка non-optional, но упадёт с крэшем, если объект уже был освобождёнВсегда применяй [weak self] в замыканиях, которые хранятся как свойства или выходят за пределы текущей области видимости. Предпочитай weak вместо unowned, если не уверен, что объект переживёт замыкание — это более безопасный вариант по умолчанию.
Retain cycle возникает, когда два объекта держат сильные ссылки друг на друга, и ARC не может освободить ни один объект, потому что их счётчики ссылок никогда не достигают нуля.
Новый — ещё не проверен сообществом
Вы