Циклы удержания возникают, когда два или более объекта имеют сильные ссылки друг на друга, создавая "замкнутый круг". Вследствие этого, счетчик ссылок каждого объекта никогда не достигает нуля, и он не может быть освобожден ARC (Automatic Reference Counting). Это приводит к утечкам памяти, так как объекты остаются в памяти даже после того, как они перестают использоваться.
Пример:
swift
В этом примере, если Person
имеет сильную ссылку на Apartment
, а Apartment
имеет сильную ссылку на Person
, то при попытке освободить эти объекты они не будут удалены, так как их счетчики ссылок не достигнут нуля.
Как решить проблему циклов удержания:
Используйте слабые (weak) или бесхозные (unowned) ссылки.
weak
: Используется, когда возможно, что связанный объект станет nil
в течение жизненного цикла другого объекта. Ссылка становится nil
автоматически, когда объект, на который она ссылается, освобождается. Является опционалом.unowned
: Используется, когда известно, что связанный объект имеет тот же или более длительный жизненный цикл, чем объект, имеющий на него ссылку. Не может быть nil
.Исправленный пример с использованием weak
:
Изменим ссылку tenant
в классе Apartment
на слабую:
swift
Циклы удержания возникают, когда два или более объекта имеют сильные ссылки друг на друга, создавая "замкнутый круг". Вследствие этого, счетчик ссылок каждого объекта никогда не достигает нуля, и он не может быть освобожден ARC (Automatic Reference Counting). Это приводит к утечкам памяти, так как объекты остаются в памяти даже после того, как они перестают использоваться.
Пример:
swift
В этом примере, если Person
имеет сильную ссылку на Apartment
, а Apartment
имеет сильную ссылку на Person
, то при попытке освободить эти объекты они не будут удалены, так как их счетчики ссылок не достигнут нуля.
Как решить проблему циклов удержания:
Используйте слабые (weak) или бесхозные (unowned) ссылки.
weak
: Используется, когда возможно, что связанный объект станет nil
в течение жизненного цикла другого объекта. Ссылка становится nil
автоматически, когда объект, на который она ссылается, освобождается. Является опционалом.unowned
: Используется, когда известно, что связанный объект имеет тот же или более длительный жизненный цикл, чем объект, имеющий на него ссылку. Не может быть nil
.Исправленный пример с использованием weak
:
Изменим ссылку tenant
в классе Apartment
на слабую:
swift
Register or sign in to get access to full answers for all questions from the question bank.