iOS использует иерархическую структуру памяти с несколькими типами:
-
ОЗУ (Оперативная Память):
- Быстрый, энергозависимый тип памяти.
- Используется для хранения активно работающих приложений и данных.
- Управляется операционной системой и механизмом ARC (Automatic Reference Counting) для объектов Swift/Objective-C.
- При нехватке памяти система может выгружать (терминировать) наименее активные приложения.
-
Встроенная Память (NAND Flash):
- Медленнее ОЗУ, но энергонезависимая.
- Используется для хранения операционной системы, приложений, пользовательских данных (фото, видео, документы).
- Имеет ограниченный ресурс по количеству циклов перезаписи.
-
Кэш-память (L1, L2, L3):
- Очень быстрая память на уровне процессора.
- Используется для хранения часто используемых инструкций и данных для ускорения доступа к ОЗУ.
ARC (Automatic Reference Counting)
- Механизм управления памятью в Swift и Objective-C, который автоматически отслеживает и управляет ссылками на объекты.
- Каждый объект имеет счетчик ссылок. Когда счетчик достигает нуля, память, занимаемая объектом, освобождается.
- Предотвращает утечки памяти, но требует внимательности при работе с циклическими сильными ссылками (
strong reference cycles), которые можно разрешать с помощью weak или unowned ссылок.
Virtual Memory
- iOS использует виртуальную память, позволяя программам использовать адресное пространство большее, чем физически доступная ОЗУ.
- Страницы памяти могут быть перенесены между ОЗУ и файловой системой (хотя в iOS это происходит ограниченно, в основном через очистку неиспользуемых страниц, а не полноценный свопинг на диск как в macOS).
- Mechanisms like "compressed memory" can compress pages instead of writing them to storage.
Управление Памятью в Приложении
- Разработчик в основном работает с памятью через ARC.
- Важно избегать утечек памяти, правильно используя
weak и unowned.
- Необходимо оптимизировать потребление памяти, например, загружая ресурсы по требованию, используя эффективные структуры данных и избегая создания избыточного количества объектов.
- Инструменты вроде Xcode Instruments (Allocations, Leaks) используются для профилирования потребления памяти и поиска утечек.
Пример использования weak для предотвращения цикла сильных ссылок:
swift