Переформатирование вашего кода, ваш второй пример:
UIImageView *secondObj = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"blue.png"]];
// changed image name once
secondObj.image = [UIImage imageNamed:@"green.png"];
// and so on....
Этот код в порядке. Когда вы назначаете изображение экземпляру UIImageView, оно увеличивает количество сохраняемых изображений на единицу. Если изображение уже присвоено, оно сначала его выпустит.
Поскольку [UIImage imageNamed: ...] даст вам объект, уже помеченный для автоматического выпуска, вы можете продолжать назначать изображения, как показано в примере, без утечек памяти. Как только UIImageView выпустит существующее изображение, оно будет собрано пулом автоматического выпуска.
С точки зрения минимизации использования памяти, метод [UIImage imageNamed: ...] сохраняет изображение в небольшом объеме кэш-памяти всего приложения, который вы не можете напрямую контролировать , Кэш имеет верхний предел, но вы не можете сбросить его, чтобы восстановить память, поэтому его использование увеличит объем используемой памяти при получении новых UIImages.
Возможно, вы захотите избежать этого кэша, используя [UIImage imageWithData: ...] для загрузки ваших изображений, что обсуждается в вопросе Stackoverflow [UIImage imageNamed…] vs [UIImage imageWithData…] .