---
title: Работа с памятью
seo:
  title: Работа с памятью — IOS Developer
  description: "Тема «Работа с памятью» для собеседования IOS Developer. Как организована работа с памятью в операционной системе iOS? Как работает автоматическое управление памятью (ARC) в iOS? Что означают атрибуты: weak, unowned, strong?"
---

[Все темы IOS Developer](/ios-developer)

## <strong>Как организована работа с памятью в операционной системе iOS?</strong> [#q-14bee738d69b814183a1c073e8ade7d2]

В приложениях на Swift ARC управляет временем жизни экземпляров классов, удерживаемых сильными ссылками. Это механизм языка и среды выполнения, а не вся система управления памятью iOS. Операционная система также управляет виртуальной памятью, изоляцией процессов и реакцией на нехватку памяти.

:::note[Ссылки для изучения]

1. [Память в Swift](https://habr.com/ru/companies/hh/articles/546856/)
   :::

---

## <strong>Как работает автоматическое управление памятью</strong> <code>&#40;ARC&#41;</code> <strong>в iOS? Что означают атрибуты&#58;</strong> <code>weak</code><strong>,</strong> <code>unowned</code><strong>,</strong> <code>strong</code><strong>?</strong> [#q-14bee738d69b810aa2a2c15ed905b94d]

ARC в Swift и Objective-C управляет временем жизни объектов по сильным ссылкам. Когда сильных ссылок не остаётся, объект освобождается. Цикл сильных ссылок ARC самостоятельно не разрывает.

- <code>strong</code>&#58; Этот атрибут используется по умолчанию и создает
  сильную ссылку на объект, что предотвращает освобождение памяти до тех пор,
  пока существует хотя бы одна сильная ссылка на объект.

- <code>weak</code>&#58; Создает слабую ссылку на объект, которая не увеличивает
  счетчик ссылок объекта. Если все сильные ссылки на объект исчезнут, объект
  будет автоматически освобожден из памяти, а слабая ссылка будет автоматически
  назначена <code>nil</code>.

- <code>unowned</code>&#58; Также создает ссылку на объект, но не увеличивает
  счетчик ссылок. Отличие от <code>weak</code> в том, что <code>unowned</code>
  предполагает, что ссылка всегда будет иметь действительное значение, и не
  станет <code>nil</code> до тех пор, пока объект жив. Если попытаться получить
  доступ к <code>unowned</code> ссылке после того, как объект был освобожден,
  это приведет к аварийному завершению приложения.

:::note[Ссылки для изучения]

1. [Память в Swift](https://habr.com/ru/companies/hh/articles/546856/)
   :::

---

## <strong>Какие методы используются для предотвращения утечек памяти?</strong> [#q-14bee738d69b81fe886cfd0a976ea966]

Для предотвращения утечек памяти в iOS можно использовать следующие методы&#58;

1. <strong>Использование слабых</strong> <code>&#40;weak&#41;</code>
   <strong>ссылок</strong>&#58; Используйте слабые ссылки для предотвращения
   циклических ссылок между объектами.

1. Освобождение ресурсов&#58; Объявите deinit для завершающей очистки. Его не переопределяют через override. Если объект удерживается циклом сильных ссылок, deinit не вызовется, поэтому такой цикл нужно устранить отдельно.

1. <strong>Использование</strong> <code>Capture Lists</code>
   <strong>для замыканий</strong>&#58; При использовании замыканий с внешним
   захватом объектов удостоверьтесь, что используете слабые ссылки или
   захватываете объекты с осторожностью, чтобы избежать циклических ссылок.

1. <strong>Использование инструментов анализа памяти</strong>&#58; В Xcode
   доступны инструменты анализа памяти, такие как Instruments, которые помогают
   обнаружить и исправить утечки памяти.

:::note[Ссылки для изучения]

1. [Память в Swift](https://habr.com/ru/companies/hh/articles/546856/)
   :::

---

## <strong>Что такое</strong> <code>ARC</code> <strong>(Automatic Reference Counting) и как он работает в Swift?</strong> [#q-14bee738d69b81bd8b65dee4bf9d1f4a]

<strong>Automatic Reference Counting</strong> <code>&#40;ARC&#41;</code> — это
система управления памятью в Swift, которая автоматически подсчитывает
количество ссылок на каждый экземпляр объекта. Когда количество ссылок на объект
становится равно нулю, объект освобождается из памяти.

Пример&#58;

```swift
class Person {
    var name: String

    init(name: String) {
        self.name = name
        print("\(name) is initialized")
    }

    deinit {
        print("\(name) is deinitialized")
    }
}

var person1: Person? = Person(name: "John")
person1 = nil // Здесь ARC освобождает память
```

:::note[Ссылки для изучения]

1. [Память в Swift](https://habr.com/ru/companies/hh/articles/546856/)
   :::

---

## <strong>В чем разница между</strong> <code>strong</code><strong>,</strong> <code>weak</code> <strong>и</strong> <code>unowned</code> <strong>ссылками?</strong> [#q-14bee738d69b8188a6cbf6cb95447a1c]

Разница между атрибутами&#58;

- <code>strong</code>&#58; Ссылка, которая удерживает объект, увеличивая счетчик
  ссылок. Используется по умолчанию.

- weak&#58; Ссылка не удерживает объект. После освобождения объекта сама слабая ссылка автоматически становится nil; это не изменение объекта.

- unowned&#58; Ссылка не удерживает объект и не обнуляется автоматически. Её используют, когда объект гарантированно жив при каждом обращении. Доступ после освобождения объекта через обычную unowned-ссылку вызывает ошибку времени выполнения.

:::note[Ссылки для изучения]

1. [Память в Swift](https://habr.com/ru/companies/hh/articles/546856/)
   :::
