Junior
72
questionbank

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

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

Утечка памяти в iOS — это ситуация, когда память, выделенная для объекта, больше не используется приложением, но система не может ее освободить, так как на этот объект до сих пор существуют сильные ссылки. Со временем это приводит к исчерпанию доступной памяти и, как следствие, к замедлению работы приложения или его аварийному завершению.

Основные причины утечек памяти связаны с циклами сильных ссылок (Strong Reference Cycles), когда два или более объекта сильно ссылаются друг на друга, предотвращая их освобождение, даже если к ним больше нет доступа извне.

Для предотвращения утечек памяти используются:

  • Automatic Reference Counting (ARC): Автоматическое управление памятью в Swift и Objective-C, которое отслеживает и управляет временем жизни объектов, автоматически освобождая память, когда strong reference count объекта становится равным нулю.

  • weak и unowned ключевые слова:

    • weak используется для ссылок, которые не должны препятствовать освобождению объекта, на который они ссылаются. Ссылка становится nil, когда объект освобождается. Используется для предотвращения циклов сильных ссылок между объектами, где один объект может существовать без другого, или когда связь является опциональной.
    • unowned также не удерживает сильной ссылки на объект, но в отличие от weak, предполагается, что ссылающийся объект будет иметь такое же или более короткое время жизни, чем объект, на который ссылаются. unowned ссылка не опциональна и не становится nil. Если объект, на который ссылаются, освобождается до того, как unowned ссылка будет использована, это приведет к крашу.

Примеры использования weak и unowned в циклах замыканий:

swift

В замыканиях cycle reference решается использованием capture list:

swift

Инструменты для выявления утечек памяти включают:

  • Instruments (Leaks): Мощный инструмент в Xcode Profile, который отслеживает выделенную и освобожденную память, показывая объекты, которые должны были быть освобождены, но не были.
  • Memory Graph Debugger: Встроенный в Xcode отладчик графа памяти, позволяющий визуализировать взаимосвязи между объектами и находить циклы сильных ссылок.
  • Static Analyzer: В Xcode анализирует код и может предупредить о потенциальных утечках памяти и других логических ошибках.