Мы используем файлы cookie
Мы используем файлы cookie для улучшения работы сайта и предоставления вам персонализированного опыта. Правила использования файлов cookie можно найти в нашей политике конфиденциальности
Циклы удержания возникают, когда два или более объекта имеют сильные ссылки друг на друга, создавая "замкнутый круг". Вследствие этого, счетчик ссылок каждого объекта никогда не достигает нуля, и он не может быть освобожден 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
Зарегистрируйтесь или войдите, чтобы получить доступ к полным ответам на все вопросы из банка вопросов.