Junior
51
questionbank

Что такое утечки памяти?

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

Утечки памяти — это ситуация, когда выделенная в памяти область более не используется программой, но при этом ссылки на нее сохраняются, препятствуя ее освобождению сборщиком мусора или системой управления памятью. В Swift, управляемом ARC (Automatic Reference Counting), утечки часто происходят из-за циклических сильных ссылок (strong reference cycles).

ARC учитывает количество сильных ссылок на объект и освобождает его, когда счетчик достигает нуля. Если два объекта сильно ссылаются друг на друга, их счетчики никогда не станут нулем, даже если на них больше нет внешних ссылок.

Примеры причин утечек:

  • Циклические сильные ссылки между экземплярами классов.
  • Циклические сильные ссылки в замыканиях. Замыкание по умолчанию захватывает переменные по сильной ссылке. Если экземпляр класса содержит сильную ссылку на замыкание, а замыкание сильно ссылается обратно на этот экземпляр, возникает цикл.

Для предотвращения циклических ссылок используются слабые (weak) и бесхозные (unowned) ссылки:

  • weak: Не увеличивает счетчик ссылок. Ссылка становится nil, когда объект, на который она ссылается, освобождается. Используется, когда объекты имеют связанный, но не эксклюзивный жизненный цикл (например, делегат). Объявляется как опционал.
  • unowned: Не увеличивает счетчик ссылок. Используется, когда ссылка на объект всегда будет существовать, пока существует объект, который на нее ссылается. Является неоционалом; при попытке обращения к освобожденному объекту приводит к сбою программы (crash). Предпочтительно для ситуаций, где один объект является "родителем" другого, и "дочерний" объект не может существовать без "родителя".

В замыканиях для разрыва циклов используются списки захвата (capture lists):

swift
swift
swift

Использование unowned self вместо weak self в замыканиях возможно, если вы уверены, что экземпляр self будет существовать на момент выполнения замыкания. В противном случае unowned self приведет к краху.

Инструменты для обнаружения утечек:

  • Instruments (Allocations, Leaks): Позволяют профилировать потребление памяти и определять циклические ссылки.
  • Memory Graph Debugger в Xcode: Визуализирует граф объектов и ссылок в памяти, что помогает быстро найти циклические ссылки.
  • MLeaksFinder (сторонняя библиотека для UIKit-приложений): Автоматически обнаруживает утечки View Controller'ов и View'ов.

Эффективное управление памятью и предотвращение утечек критически важно для стабильности и производительности iOS-приложений.