Реализация -drawRect:
заставляет систему выделять растровое изображение того же размера, что и ваш вид (в конце концов, вам нужен буфер для рисования). Если все, что вы делаете, это рисуете изображение, которое вы уже загрузили, то одним махом вы удвоили использование памяти для этого изображения (потому что у вас есть загруженная копия и вторая копия, которую вы только что нарисовали).
Точно так же растеризация слоев требует выделения растровых изображений того же размера, что и слой, поэтому у него есть буфер для растеризации. Таким образом, включение этого также высасывает память (пропорционально размеру слоя).
Основное правило: не делай лишней работы. Использование -drawRect:
для рисования изображения - дополнительная работа. Растеризация слоя - это дополнительная работа (хотя, в зависимости от того, что это за слой, это может быть разовая стоимость производительности (и постоянная стоимость памяти), чтобы впоследствии сэкономить на производительности, например, если это CAShapeLayer
или если рисование теней). Хранение больших изображений в памяти, которые вы всегда уменьшаете, перед рендерингом на экран - дополнительная работа (просто уменьшите их один раз, когда вы загружаете изображение, и сохраняйте масштабированную копию).
Еще одна вещь, которую нужно иметь в виду: если ваша цель - рисовать изображения, вы должны попытаться использовать UIImageView
, если это возможно. Как правило, это самый быстрый и дешевый способ вывести изображение на экран, и он достаточно гибкий.