Проблема с памятью в iPhone? - PullRequest
0 голосов
/ 15 мая 2009

Я использую один объект UIImageView, выделил ему память один раз. Но меняются имена изображений несколько раз. Вопрос в том,

A) один объект UIImageView, выделенный один раз и никогда не меняющий имя изображения. например, UIImageView * firstObj = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @ "blue.png"]];

B) другой объект UIImageView, выделенный один раз и измененный имена изображений несколько раз

например, UIImageView * secondObj = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @ "blue.png"]];

// изменил имя изображения один раз,

secondObj.image = [UIImage imageNamed: @ "green.png"];

 and so on....

какие объекты используют максимум памяти или используют равную память?

Каков наилучший способ использовать secondObj с минимальным использованием памяти?

Пожалуйста, объясните это кратко, потому что мне нужно использовать номер изображения в моем проекте, и я хочу избежать проблемы с памятью из-за изображений.

Ответы [ 4 ]

3 голосов
/ 15 мая 2009

Переформатирование вашего кода, ваш второй пример:

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…] .

0 голосов
/ 15 мая 2009

UIImage, созданный с использованием + imageNamed: автоматически выпущен, поэтому он исчезнет. Для примера:

UIImage *image1 = [UIImage imageNamed:@"blue.png"]; //image1 has retain count 1
[myImageView setImage:image1]; //image1 is retained by UIImageView so has retain count 2

//run loop ends, all auto released objects are released and image1 now has retain count 1

//Later in app

UIImage *image2 = [UIImage imageNamed:@"green.png"]; //image2 has retain count 1
[myImageView setImage:image2]; //image1 is released and now has retain count 0, so the memory is freed, image2 now has retain count 2 as it is retained 
0 голосов
/ 15 мая 2009

Поскольку никакие другие объекты (кроме UIImageView) не сохраняют UIImage, они должны быть освобождены после их замены в UIImageView, и сборщик мусора должен выполнить свою работу.

Имейте в виду, что на iPhone нет сборщика мусора. Вы можете найти больше об этом здесь:
StackOverflow: поддерживается ли сборка мусора для приложений iPhone?

(На самом деле это должен быть комментарий к ответу Дэвидса, но у меня пока недостаточно репутации)

0 голосов
/ 15 мая 2009

Я не большой специалист по Objective-C, но ваше использование в B выглядит так, как будто оно должно работать без утечек. Поскольку никакие другие объекты (кроме UIImageView) не сохраняют UIImages, они должны быть освобождены при их замене в UIImageView, и сборщик мусора должен выполнить свою работу.

David

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...