Управление памятью и UIImageViews в файлах NIB - PullRequest
0 голосов
/ 15 марта 2011

Я создал пример приложения, в котором в качестве фона установлен базовый полноэкранный UIImageView. Это приложение очень простое. Все это 2 страницы. (Я выложу код ниже). NIB только как UIImageView. Я пробовал 2 разных сценария -

Есть ли проблема с выпуском файлов и изображений NIB.

У меня были некоторые утечки памяти.

1) Пример 1 (ПЛОХО) - я загружаю изображение прямо в NIB. Когда я нажимаю на вид, память увеличивается на 5 МБ. Когда я высовываю (используя NavigationController) вид сверху, память только уменьшается на 1,5 МБ. Dealloc действительно называется. У меня нет IBOutlets. Так что для меня это либо кэширование, либо сохранение этого изображения в памяти где-то.

2) Пример 2 (ХОРОШО) - Установите IBOutlet для представления UIImage, и я помещаю изображение в UIImageview, как показано ниже (я знаю, что могу создать UIImageView программно, но я проверяю память здесь, а не мои навыки создания экрана ). Это хорошо очищает после себя. Это удаляет изображение из памяти, и я вижу в инструментах, что память уменьшается.

@interface Page3VC : UIViewController {
    UIImageView*backimage;
}
@property(retain, nonatomic) IBOutlet UIImageView*backimage;
end

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];

    backimage.image = [self getImage:@"hipHome.png"];
}
-(void)viewDidDisappear:(BOOL)animated {
    backimage.image = nil;

    [super viewDidDisappear:animated];
}

-(UIImage*)getImage:(NSString*)imageName{
    //return [UIImage imageNamed:imageName];
    return [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:imageName ofType:nil]];
}

Ответы [ 2 ]

3 голосов
/ 15 марта 2011

Загрузка изображений через NIB может быть проблематичной - известно, что она «просачивается» из-за поведения кэширования, но это сделано специально - см. этот вопрос .Это кэширование полезно для отображения небольших изображений в UITables (высокая производительность), но не подходит для загрузки одного огромного изображения в ваш пользовательский интерфейс.

Нам нужно увидеть больше вашего кода!Как определяется getImage?

Если вы используете UIImage imageNamed: где-либо в своем собственном коде, вы должны знать, что он кэширует загруженные изображения в память.Удаление такого изображения на самом деле не будет выгружать кэшированное изображение в память!

Для получения дополнительной информации, пожалуйста, смотрите:

Разница между [UIImage imageNamed ...] и [UIImage imageWithData ...]?

0 голосов
/ 15 марта 2011

в сценарии 2 вы должны также сбросить backimage, прежде чем установить его в nil ...

и, пожалуйста, опубликуйте код, куда вы загружаете / инициализируете свой подкласс UIViewController ...

и гдевы отпускаете его ...

я имею в виду, мы видим объекты, загруженные внутри вашего класса, но проблема может быть вне его, когда вы загружаете и используете свой класс (делегат приложения? rootMainUIViewController / navigation controller?)

...