Встречается на 54% собеседований по Mobile

Как устроена память

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

Иерархия памяти

Память устроена как пирамида: сверху — самые быстрые и маленькие уровни, снизу — медленные и большие. Это позволяет сбалансировать скорость доступа и объём хранилища.

  • Регистры процессора — встроены в CPU, работают на частоте процессора, хранят данные, с которыми процессор работает в данный момент. Объём — несколько десятков байт.
  • Кэш-память — расположена на процессоре или рядом, делится на уровни L1, L2, L3. L1 — самый быстрый и маленький (обычно 32–64 КБ), L2 — больше (несколько сотен КБ), L3 — общий для ядер (несколько МБ). Кэш хранит копии часто используемых данных из ОЗУ.
  • Оперативная память (ОЗУ) — основное хранилище для работающих программ и данных. Быстрая, но энергозависимая: при выключении питания данные теряются. Объём — от нескольких ГБ до десятков ГБ.
  • Постоянная память (ПЗУ, SSD, HDD) — энергонезависимая, хранит данные долговременно. SSD работает на флеш-памяти и быстрее HDD, который использует магнитные диски.
  • Виртуальная память — механизм ОС, позволяющий использовать часть диска как расширение ОЗУ. Когда ОЗУ заполнено, редко используемые страницы перемещаются в файл подкачки (swap), освобождая место.

Управление памятью в Swift

Swift использует ARC (Automatic Reference Counting) для автоматического управления памятью. Каждый объект класса имеет счётчик ссылок. Когда счётчик падает до нуля, память объекта освобождается. Это предотвращает утечки и переполнение памяти.

Пример:

swift
class Person {
    let name: String
    init(name: String) { self.name = name }
}

var person1: Person? = Person(name: "Alice")
var person2 = person1  // счётчик ссылок = 2
person1 = nil          // счётчик = 1
person2 = nil          // счётчик = 0, память освобождается

ARC работает только для классов (ссылочных типов). Структуры и перечисления — значимые типы, они хранятся в стеке и копируются при присваивании.

Подводные камни

  • Циклы сильных ссылок — когда два объекта ссылаются друг на друга, счётчики не обнуляются, и память не освобождается. Решение — использовать weak или unowned для одной из ссылок.
  • Утечки в замыканиях — если замыкание захватывает self сильно, а self хранит замыкание, возникает цикл. Используйте [weak self] в списке захвата.
  • Виртуальная память — на iOS не используется файл подкачки, вместо этого применяется сжатие памяти и принудительное завершение фоновых процессов.

Коротко

  • Память — иерархия: регистры, кэш, ОЗУ, ПЗУ, виртуальная память.
  • Swift управляет памятью через ARC, освобождая объекты с нулевым счётчиком ссылок.
  • Опасность — циклы сильных ссылок, их избегают с помощью weak и unowned.
  • На iOS нет swap-файла, вместо этого — сжатие памяти и выгрузка процессов.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы