Проблема памяти iOS UIImageView - PullRequest
       10

Проблема памяти iOS UIImageView

0 голосов
/ 01 апреля 2011

Я пытался решить проблему, связанную с тем, что изображение в моем UIImageView было выпущено из-за предупреждений памяти.

Вот моя ситуация:

1) Я объявляю UIImageView в моем .H:

IBOutlet UIImageView *fightStyleImage;
...
@property (nonatomic, retain) UIImageView *fightStyleImage;

2) Я синтезирую и делок в моем .M:

@synthesize fightStyleImage;
...
...
-(void)dealloc{
[fightStyleImage release];
...
}

3) Я прикрепляю fightStyleImage к UIImageView в Интерфейсном Разработчике.

4) Часть опыта моего приложения позволяет пользователю проводить пальцем по устройству, переключаясь между 5 различными изображениями. Для этого я использую следующий код:

// Load next image
UIImage *theImg = [UIImage imageNamed:@"fighter1.png"];
fightStyleImage.image = theImg;

Все работает очень хорошо, и я доволен производительностью, опытом и т. Д.

Однако, когда я открываю другой контроллер представления (или MFMailComposeViewController, или средство выбора адресной книги), и мое устройство получает предупреждение о памяти (через симулятор или на устройстве), происходит следующее, когда я возвращаюсь в мой оригинальный контроллер представления: iOS, кажется, отбрасывает мое изображение UIImageView (я полагаю, потому что это самый дорогой объект в памяти), и у меня остался черный экран (то есть без изображения). Если я начну снова проводить пальцем, изображения вернутся и продолжат цикл правильно.

Я хотел бы услышать любые мысли по этому поводу, и заранее благодарен за любые решения / идеи, которые кто-либо мог бы иметь. В частности, я заинтересован (конечно!) В восстановлении моего изображения, которое было выброшено из памяти.

-SD

Ответы [ 2 ]

0 голосов
/ 08 апреля 2013

Возможно, проблема связана с использованием метода imageNamed:, поскольку он кэширует изображения в вашей памяти и будет принудительно освобожден только при появлении предупреждения о недостаточном объеме памяти. Лучше идти по этому пути:

UIImage *image=[[[UIImage alloc]initWithContentsOfFile:imagePath]autorelease];
0 голосов
/ 01 апреля 2011

Вам необходимо правильно реализовать viewDidLoad и viewDidUnload, чтобы настроить и освободить ваши представления.Прочтите раздел iOS 1003 * Руководство по программированию управления памятью для получения помощи.Я также рекомендую переместить вашу декларацию IBOutlet из ivar в собственность, так что

UIImageView *fightStyleImage;
...
@property (nonatomic, retain) IBOutlet UIImageView *fightStyleImage;
...