Junior
19
0
questionbank

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

Answer from sobes.tech neural network

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

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

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

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

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

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

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

swift

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

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

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

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

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

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

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

swift

Register or sign in to get access to full answers for all questions from the question bank.

memory-leaksmemory-managementgarbage-collectionresource-managementperformance-tuning