У меня есть эта огромная проблема с управлением памятью.UIScrollView с большим количеством UIImageViews - Управление памятью
Проблема:
У меня есть UIScrollView
, у меня есть массив с 24 путями к изображениям в нем, и я хочу, чтобы показать их в UIScrollView
с пейджинговой поддержкой.
Все изображения в размере 1024x748 (разрешение ландшафта в iPad со статусной строкой), а файл - jpg или png.
Я использую ленивая загрузка, чтобы не превышать память, когда viewDidLoad
. И я собираюсь с ленивым образцом загрузки от Apple с помощью PageControl. Хотя я использую UIImageViews
вместо UIViews
.
Так что моя проблема в том, что когда я прокручиваю третье изображение, я хочу удалить первое изображение из UIScrollView
и освободить его память. Поскольку в дальнейшем я прокручиваю, больше памяти стекает. Когда я загружаю страницу в UIScrollView и загружается и добавляется новое изображение, используется около 5000kb памяти, и когда я вхожу в unloadPage:
(см. Ниже), ничего не выпускается. Я просто «делаю это неправильно»?
Как правильно снять и удалить UIImageViews
?
(я загружая UIImages с initWithContentsOfFile:
)
Вот мой код:
@interface SlideViewController : UIViewControllerExtended <UIScrollViewDelegate> {
ScrollViewController *slider;
IconView *currentChapter;
NSMutableArray *chapters;
NSMutableArray *views;
UIImageView *controller;
}
Ленивая функцией нагрузкой:
- (void) loadImageToScrollView:(NSInteger)chapter withPage:(NSInteger)page {
if (page < 0) return;
if (page >= chapterCount) return;
if([views objectAtIndex:page] != [NSNull null]) return;
NSMutableArray *all = [[currentChapter getImages] copy];
if(!([[all objectAtIndex:page] rangeOfString:@".mp4"].length > 0)) {
controller = [views objectAtIndex:page];
if((NSNull *)controller == [NSNull null]) {
NSArray *paths = [[all objectAtIndex:page] componentsSeparatedByString:@"."];
NSString *name = [[NSString alloc] initWithString:[paths objectAtIndex:0]];
NSString *ending = [[NSString alloc] initWithString:[paths objectAtIndex:1]];
NSString *file = [[NSString alloc] initWithFormat:@"%@", [[NSBundle mainBundle] pathForResource:name ofType:ending]];
UIImageView *tempImage = [[UIImageView alloc] initWithFrame:CGRectMake(page * 1024, 0, 1024, 768)];
UIImage *img = nil;
img = [[UIImage alloc] initWithContentsOfFile:file];
[tempImage setImage:img];
[tempImage setTag:page];
self.controller = tempImage;
[tempImage release];
[slider addSubview:controller];
[views replaceObjectAtIndex:page withObject:controller];
[name release];
[ending release];
[file release];
}
}
[all release];
}
Вид выгрузки метод (который, похоже, не работает):
- (void) unloadPage: (int) page {
if(page < 0) return;
if(page >= chapterCount) return;
if((NSNull *)[views objectAtIndex:page] != [NSNull null]) {
UIImageView *viewToDelete = [views objectAtIndex:page];
[viewToDelete removeFromSuperview];
[views replaceObjectAtIndex:page withObject:[NSNull null]];
}
}
Полное имя сеанса: «Сессия 104 - Проектирование приложений со списком прокрутки» – Bastian