2009-03-17 10 views
0

누군가가 iPhone의 메모리 문제로 나를 도울 수 있기를 바랬습니다.자동 출시 풀

nav 컨트롤러의 일부인 scrollview가 있습니다.

먼저 nav 컨트롤러를 누르고 스크롤 뷰를 스크롤 할 때마다 (이미지가 추가됨) 메모리는 거대한 덩어리로 할당됩니다 (예 : 각 1MB).

디스플레이를 두 번 회전하면 메모리가 해제되고 모든 것이 정상입니다. scrollview가 올바르게 작동하고 메모리가 원래 위치 (즉, 약 1MB, 인스트루먼트의 넷 할당을보고)로 돌아갑니다.

메모리가 거칠어지지 않도록하려면 어떻게해야합니까? 아니면 기기 회전과 마찬가지로 스크롤보기 사용 중에 메모리를 비울 수 있습니까? 여기

가있는 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. 없음) scrollViewDidEndDecelerating에서

- (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, 당신의 PageControl의 페이지 변경 조치 및 viewWillAppear.

+0

안녕하세요. 귀하의 updateCachedPages 메소드를 구현해야합니다. –

0

않는 메모리 낮은 통지에 컨트롤러주의를 기울? 수령시 표시되지 않는 이미지를 플러시하거나 관련성이 있다고 생각되는 다른 이미지를 플러시 할 수 있습니다.

0

좋아, 결국 모든 메모리를 해제하지 못했습니다.

클래스 인스턴스가 제대로 해제되지 않고 tewha의 제거 코드가 작동하는지 확인한 후에는 모든 것이 황금으로 처리됩니다.

빠른 도움에 감사드립니다. 이 포럼은 대단합니다.

+0

질문을 닫아서 대답하지 않은 목록에 나타나지 않도록해야합니다. –

관련 문제