UIScrollView со многими UIImageViews - Управление памятью - PullRequest
4 голосов
/ 04 сентября 2010

У меня огромная проблема с управлением памятью.

Проблема :
У меня UIScrollView, у меня массив с 24 путями к изображениями я хочу показать их в UIScrollView с включенной подкачкой.

Все изображения имеют размер 1024x748 (альбомное разрешение iPad со строкой состояния), а тип файла - jpg или png.

Я использую ленивая загрузка просто чтобы не превышать память при viewDidLoad.И я иду с ленивым образцом загрузки от Apple с PageControl.Хотя я использую UIImageViews вместо UIViews.

Так что моя проблема в том, что когда я прокручиваю до третьего изображения, я хочу удалить первое изображение из UIScrollView и освободить его память.Потому что чем дальше я прокручиваю, тем больше памяти истощается.Когда я открываю страницу в UIScrollView и загружается и добавляется новое изображение, используется около 5000 КБ памяти, и когда я вхожу в 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]];
    }
}

Ответы [ 2 ]

7 голосов
/ 06 сентября 2010

Проблема решена путем просмотра видеосессии #104 в WWDC2010 . Который можно найти на сайте разработчика Apple .

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

0 голосов
/ 27 июня 2013

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

...