4

У меня есть эта огромная проблема с управлением памятью.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]]; 
    } 
} 

ответ

7

Задача решается путем наблюдать #104 видеосеанс на WWDC2010. Который можно найти на Apple Developer site.

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

+4

Полное имя сеанса: «Сессия 104 - Проектирование приложений со списком прокрутки» – Bastian

0

VSScrollview хотя я опаздываю, но для других пользователей я создал класс VSScrollview, который повторяет его представления, такие как UITableView повторно использует свою ячейку. Его использование простое. Пройдите через readme по ссылке

Смежные вопросы