Что влияет на производительность при работе с кучей
Что проверяют
Понимаете ли вы, как в iOS устроена работа с памятью на самом деле, и что именно стоит дорого. Ответ сразу показывает, профилировали ли вы приложение или пересказываете общие слова про оптимизацию.
Как отвечать
Первое, что стоит проговорить: сборщика мусора в iOS нет. Управление памятью автоматическое, но это ARC, то есть расставленные компилятором вызовы удержания и освобождения. Значит цена это сами счётчики ссылок и работа аллокатора, а не паузы на сборку.
Что влияет на производительность:
- что вообще попадает в кучу. Классы и замыкания, захватившие контекст, размещаются в куче. Структуры и перечисления живут по значению, а массивы, строки и словари это типы-значения с буфером в куче и копированием при записи;
- частота выделений. Горячий цикл, который создаёт объект на каждой итерации, например форматтер на каждую ячейку списка, бьёт сильнее, чем один крупный объект;
- трафик ARC: счётчики атомарны, лишние удержания на каждой передаче объекта стоят времени. Помогают
finalиprivate, работа со значимыми типами, аккуратноеweak, которое дорожеunowned; - неожиданные копии при записи, когда на буфер осталась не одна ссылка. В своих типах это проверяется через
isKnownUniquelyReferenced; - крупные буферы: декодированная картинка занимает примерно
ширина * высота * 4байта независимо от веса файла, кэш стоит держать вNSCache.
И добавьте про предел: приложение не уходит в своп, система сжимает память и снимает процесс по лимиту, поэтому перерасход выглядит как падение без внятного стека. Инструменты: Instruments и граф памяти в отладчике.
Где спотыкаются
Рассказывают про сборщик мусора и его настройку. Этого механизма тут нет, и дальше разговор обычно не идёт.
Считают циклы сильных ссылок только утечкой памяти. Удержанный контроллер продолжает получать события и обновлять то, чего пользователь уже не видит, то есть тратит ещё и процессорное время.
Путают вес файла и размер изображения в памяти. Небольшая по весу картинка после декодирования занимает десятки мегабайт, и именно она чаще всего роняет приложение по лимиту.