UIImage вызывает утечку памяти

Инструменты говорят мне, что выделяется много памяти, когда я быстро устанавливаю имя изображения UIImageview в своем приложении. У меня есть UIImageView, который меняет имя изображения каждый кадр в моей игре. При профилировании с помощью зомби, проверяющих инструменты, приложение, кажется, постоянно набирает живые байты с огромной скоростью. Есть ли способ освободить текущий образ UIImageView, чтобы он не делал этого? Я использую АРК.

Мой код для назначения изображения UIImageView выглядит следующим образом:

aPlanet.image = [UIImage imageNamed:tempPlanetName];

Где aPlanet — это UIImageView, а tempPlanetName — название изображения. Это называется каждый кадр.


person Fitzy    schedule 04.01.2013    source источник
comment
напишите свой код того, как вы назначаете изображение своему изображению   -  person P.J    schedule 04.01.2013
comment
Вы должны делать что-то нелепое в блоке @autoreleasepool. Или используйте что-то гораздо более легкое, например CALayer, таким образом вы не выделяете два объекта только для отображения изображения один раз в каждом кадре.   -  person CodaFi    schedule 04.01.2013
comment
Кроме того, iOS будет кэшировать ваши изображения, если вы используете imageNamed, так что будьте осторожны.   -  person borrrden    schedule 04.01.2013
comment
выложи свой код!! мы не можем догадаться, что вы делаете!   -  person DD_    schedule 04.01.2013
comment
Код, который я использую, теперь показан в вопросе. @borrrden, что вы подразумеваете под «кэшем»?   -  person Fitzy    schedule 04.01.2013


Ответы (2)


Когда вы используете UIImage imageNamed:, он загружает и кэширует этот файл изображения. Это предназначено для повторного использования значков и других ресурсов изображений, которые будут использоваться в вашем приложении более одного раза.

Помимо того, что обновление представления изображения новым изображением в каждом кадре кажется несколько необычным, вам следует изучить альтернативные способы загрузки изображений, которые вам не понадобятся более одного раза, или даже если они вам понадобятся, когда вам нужен больший контроль над их жизненным циклом. .

Например, взгляните на UIImage imageWithContentsOfFile: (задокументировано здесь: Справочник по библиотеке разработчиков Apple). В нем явно указано, что этот метод не будет кэшировать содержимое изображения.

Я надеюсь, что это поможет вам, но для каждого кадра я сомневаюсь, что ваша производительность будет достаточно хорошей с таким подходом, но это, вероятно, тема другого вопроса, если возникнет необходимость.

person Daniel Schneller    schedule 04.01.2013
comment
При использовании метода UIImage imageWithContentsOfFile: используется гораздо больше памяти, чем при использовании метода UIImage imageNamed:. Хотя я понимаю, откуда вы, похоже, есть проблема, когда вызов метода выделяет память, но затем она не освобождается. Вот тут я больше всего запутался. - person Fitzy; 04.01.2013
comment
Вы используете АРК? Если нет, вам придется самостоятельно освободить экземпляр образа, чтобы снова освободить память. - person Daniel Schneller; 04.01.2013
comment
Да, я использую ARC. Но почему-то память просто не освобождается. - person Fitzy; 04.01.2013

Метод [UIImage ImageNamed:] загружает изображение в представление изображения и добавляет этот вновь созданный объект uiimage в пул автоматического освобождения. Чтобы избавиться от этой проблемы, вы должны использовать -

NSString *imgPath = [основной пакет NSBundle] pathForResource:@"imageName" ofType:@"png"]; aPlanet.image = [[UIImage alloc] ]initWithContentsOfFile:imgPath];

если вы используете дугу, вам не нужно беспокоиться об освобождении этого недавно выделенного объекта uiimage, который был создан с использованием метода initWithContentsOfFile:.

person Pankaj Yadav    schedule 04.01.2013