2009-03-17 2 views
0

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

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

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

Если я поворачиваю дисплей пару раз, память освобождается, и все в порядке: функция прокрутки работает правильно, и память возвращается туда, где она должна быть (около 1 мб, глядя на выделение сети в Инструменты).

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

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

- (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]; 
    } 

}

ответ

0

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

Ваш код несколько похож на пример Apple PageControl, верно?

То, что я делаю, представляет собой цикл через страницы каждый раз, когда страница «активирована» и очищает страницы более чем на 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

привет, мне нужно, чтобы вы реализовали свой метод updateCachedPages –

0

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

0

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

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

Благодарим за помощь. Этот форум потрясающий BTW.

+0

Вы должны закрыть вопрос, чтобы он не отображался в неотвеченном списке. –