Какие области памяти создаются при запуске iOS приложения
Что проверяют
Понимаете ли вы, что происходит до application(_:didFinishLaunchingWithOptions:): как загрузчик раскладывает бинарник по памяти и где потом живут ваши данные. Следом часто спрашивают, всегда ли структура в Swift лежит на стеке.
Как отвечать
Процесс получает виртуальное адресное пространство, а загрузчик dyld отображает в него исполняемый файл Mach-O по сегментам, со случайным базовым адресом (ASLR):
__PAGEZERO: недоступная область в начале адресного пространства, на 64-битных системах 4 ГБ. Разыменование нулевого указателя падает сразу;__TEXT: машинный код и неизменяемые данные вроде строковых литералов. Только чтение и исполнение, страницы «чистые»: система может выбросить их и перечитать с диска;__DATA_CONSTи__DATA: глобальные и статические переменные, служебные структуры рантайма Objective-C.__DATA_CONSTпосле настройки загрузчиком становится только для чтения;__LINKEDIT: таблицы символов и данные для загрузчика.
Системные фреймворки не грузятся по одному, а берутся из общего кэша dyld, который отображён во все процессы.
Во время работы появляются:
- стеки потоков: у главного потока 1 МБ, у остальных по умолчанию 512 КБ;
- куча: экземпляры классов, буферы
Array,StringиData, значения, захваченные замыканиями. Временем жизни объектов управляет ARC через счётчик ссылок.
Хорошо добавить, что swap на диск в iOS нет: грязные страницы сжимаются, а при превышении лимита процесс убивает jetsam. Смотреть расклад удобно в Instruments (Allocations, VM Tracker) и в Memory Graph Debugger в Xcode.
Где спотыкаются
Говорят «структуры на стеке, классы в куче». Структура в свойстве класса, в массиве или захваченная замыканием живёт в куче, а большое значение внутри экзистенциального контейнера тоже уходит в кучу.
Уверены, что глобальные переменные Swift инициализируются при запуске. Они ленивые и потокобезопасно создаются при первом обращении, исключение составляет код верхнего уровня в main.swift.
Называют «кэш» отдельной областью памяти. NSCache это обычный объект в куче, который система вычищает при нехватке памяти, а URLCache хранит данные в памяти и на диске.