Разработка iPhone - проблема с памятью UIImageView - PullRequest
2 голосов
/ 12 февраля 2010

Справочная информация:

Вдохновленный примером кода Apple ScrollViewSuite, я создал класс контроллера представления, который показывает миниатюры изображений и одно выбранное изображение. Иерархия элементов управления для «выбранного» изображения выглядит примерно так:

--> UIView
    --> UIScrollView
        --> UIImageView

Следующий код используется для помещения UIScrollView в представление:

imageScrollView = [[UIScrollView alloc] initWithFrame:frame];
[imageScrollView setBackgroundColor:[UIColor clearColor]];
[imageScrollView setDelegate:self];
[imageScrollView setBouncesZoom:YES];
[[self view] addSubview:imageScrollView];

... и следующий код используется для настройки и добавления UIImageView в UIScrollView:

// Custom method to return a UIImage from a URL string
UIImage *image = [UIImage newImageWithContentsOfURL:imageURL];  

// first remove previous image view, if any
[[imageScrollView viewWithTag:MAIN_IMAGE_TAG] removeFromSuperview];

// set the new image view
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[imageView setDelegate:self];
[imageView setTag:MAIN_IMAGE_TAG];
[imageScrollView addSubview:imageView];
[imageScrollView setContentSize:[imageView frame].size];

// choose minimum scale so image width fits screen
float minScale  = [imageScrollView frame].size.width / [imageView frame].size.width;
[imageScrollView setMinimumZoomScale:minScale];
[imageScrollView setZoomScale:minScale];
[imageScrollView setContentOffset:CGPointZero];

// clear memory
[imageView release];
imageView = nil;

[image release];
image = nil;

Вот метод категории, который я использовал для получения UIImage с использованием строки URL:

+ (UIImage *)newImageWithContentsOfURL:(NSString *)imageURL {   
    NSURL *url = [[NSURL alloc] initWithString:imageURL];
    NSData *data = [[NSData alloc] initWithContentsOfURL:url];
    UIImage *image = [[UIImage alloc] initWithData:data];
    [data release];
    [url release];

    return image;
}

Проблема: Эффект загрузки изображения в формате JPEG размером 110 КБ (приблизительно) заключается в том, что реальная память приложения увеличивается с 12 МБ (приблизительно) до 38 МБ (приблизительно). Я был сбит с толку, когда впервые увидел это. Как это возможно? Ну и конечный результат: приложение вылетает на iPhone 3G (иногда).

Обратите внимание, что показания памяти были получены с помощью инструмента Memory Monitor в Instruments - во время тестирования приложения на устройстве (не на симуляторе). Также обратите внимание, что инструменты не обнаруживают утечек памяти, а Static Analyzer также не указывает ни на что подозрительное.

Мне нужна помощь!

Ответы [ 2 ]

3 голосов
/ 12 февраля 2010

Может ли это быть как-то связано с тем, что JPEG сжато. Это может быть несжатым при отображении, следовательно огромный скачок в памяти.

Каковы размеры изображения в масштабе 1: 1?

0 голосов
/ 10 июля 2010

Конечно, это должно быть что-то другое, чем jpeg, который заставляет его использовать столько памяти и сбоев - у меня есть png, который составляет 15200x250 px, и он прекрасно прокручивается ...

...