Авто-релиз бассейн - PullRequest
       17

Авто-релиз бассейн

0 голосов
/ 18 марта 2009

Я надеялся, что кто-нибудь может помочь мне с проблемой памяти на iPhone.

У меня есть прокрутка, являющаяся частью контроллера навигации.

Всякий раз, когда я впервые нажимаю на навигационный контроллер и прокручиваю просмотр прокрутки (добавляя изображения по мере движения), память выделяется огромными кусками (скажем, по 1 МБ каждый).

Если я поверну дисплей пару раз, память будет освобождена, и все в порядке: представление прокрутки работает правильно, и память возвращается туда, где она должна быть (около 1 МБ, глядя на Net alloc в Instruments).

Как сохранить память или освободить ее во время использования прокрутки, как вращение устройства?

Вот фрагмент кода, который вызывается для загрузки страницы просмотра прокрутки:

- (void)loadPage:(int)page isCurrent:(BOOL)isCurrent {
if (page < 0) return;
if (page >= totalRows) return;
picViewController *controller = [[picViewController alloc] init];
if ((NSNull *)[viewControllers objectAtIndex:page] == [NSNull null]) {
        NSString *fullPath = [self fullPath];
    if([fileManager fileExistsAtPath:fullPath]) {
        currentImage=[UIImage imageWithContentsOfFile:fullPath];
        [controller setImg:currentImage];
        [viewControllers replaceObjectAtIndex:page withObject:controller];
    }
    else {
            AsyncImageView* asyncImage = [[AsyncImageView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
            asyncImage.tag = 8;
            [asyncImage loadImageFromName:imageName withURL:url];
            [controller.view addSubview:asyncImage];
            [asyncImage release];
            [viewControllers replaceObjectAtIndex:page withObject:controller];
        }
        if (nil == controller.view.superview) {
            CGRect frame = scrollView.frame;
            frame.origin.x = frame.size.width * page;
            frame.origin.y = 0;
            controller.view.frame = frame;
            [scrollView addSubview:controller.view];
        }
    [controller release];
    }

}

Ответы [ 3 ]

0 голосов
/ 18 марта 2009

Я не вижу, где в вашем коде вы фактически удаляете закадровые страницы.

Ваш код чем-то напоминает пример PageControl от Apple, верно?

Что я делаю, так это перебираю страницы каждый раз, когда страница «активируется», и удаляю страницы более чем на 1 или 2 экрана. (1 для без прокрутки, 2 для с.)

- (void)updateCachedPages {
    int active = pageControl.currentPage;
    int count = pageControl.numberOfPages;
    for ( int i = 0; i < count; i++ ) {
        if ( abs( active - i ) <= 2 ) {
            [self loadPage:i];
        }
        else {
            [self purgePage:i];
        }
    }
}

- (void)purgePage:(int)page {
    if ((page < 0) || (page >= [_myObjects count])) return;

    MyControllerClass *controller = [_viewControllers objectAtIndex:page];
    if ((NSNull *)controller != [NSNull null]) {
        [_viewControllers replaceObjectAtIndex:page withObject:[NSNull null]];
        //NSLog( @"Purged page %d", page );
    }
}

Звоните updateCachedPages в scrollViewDidEndDecelerating, действие изменения страницы вашего PageControl и viewWillAppear.

0 голосов
/ 18 марта 2009

ОК, я не освобождаю всю память.

Как только я обнаружил, что экземпляр класса не был освобожден должным образом, и убедился, что код очистки tewha работает, все становится золотым.

Спасибо за быструю помощь. Этот форум удивительный BTW.

0 голосов
/ 18 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...