2011-03-29 2 views
1

저는 메모리 관리에 큰 문제가 있습니다. 실제로는 커다란 잡지와 자신의 PageViewController로 렌더링되는 모든 페이지가 있습니다. 여러분이 언젠가 봤다면 내 문서는 애플 문서의 PageControl 예제를 기반으로합니다.viewController와 그의 뷰를 NSMutableArray 뷰 컨트롤러에서 해제하는 방법은 무엇입니까?

그래서 "MainViewController"의 viewDidLoad에서 NSMutableArray = self.viewControllers를 NSNull 객체로 만듭니다. 그리고 내 첫 번째 및 두 번째 페이지에 대해 [self loadScrollViewPage:page];이라고 부릅니다. 사용자가 더 많은 페이지를 탐색 할 때 scrollViewDidScroll에서 더 많은로드가 호출됩니다. [self loadScrollViewPage:nextPage];으로 앱이 필요합니다. 또한 unloadScrollViewPage:page을 구현합니다. 왜냐하면 잡지가 너무 커서 그럴 경우 메모리가 없어지기 때문입니다.

- (void)loadScrollViewPage:(int)pageNumber 
{ 
    if ((pageNumber < 0) || (pageNumber >= [self.viewControllers count])) 
     return; 

    PageViewController *controller = [self.viewControllers objectAtIndex:pageNumber]; 
    if ((NSNull *)controller == [NSNull null]) 
    { 
     controller = [[PageViewController alloc] initWithPage:[self.pages objectAtIndex:pageNumber]]; 
     [self.viewControllers replaceObjectAtIndex:pageNumber withObject:controller]; 
     [controller release]; 
    } 

    if (controller.view.superview == nil) 
    { 
     CGRect frame = mainpageScrollView.frame; 
     frame.origin.x = 0; 
     frame.origin.y = frame.size.height * pageNumber; 
     controller.view.frame = frame; 
     [mainpageScrollView addSubview:controller.view]; 
    } 
} 
- (void)unloadScrollViewPage:(int)pageNumber 
{ 
    if ((pageNumber < 0) || (pageNumber >= [self.viewControllers count])) 
     return; 

    if ((NSNull *)[self.viewControllers objectAtIndex:pageNumber] != [NSNull null]) 
    { 
     [[[self.viewControllers objectAtIndex:pageNumber] view] removeFromSuperview]; 
     [self.viewControllers removeObjectAtIndex:pageNumber]; 
     [self.viewControllers replaceObjectAtIndex:pageNumber withObject:[NSNull null]]; 
    } 
} 

문제는 상관없이 내가 loadScrollViewPage를 호출하고 unloadScrollViewPage으로 감소하지 않을 때, 메모리가 여전히 크기를 증가 얼마나 많은 내가 unloadScrollViewPage 전화 번입니다 :

그래서,이 내 코드입니다. 사용자가 (? LOL, 300 페이지의) 10 페이지에가는 때, 내 응용 프로그램의 메모리 크기는 내 질문은 :(

인 100MB 물론, 그것은 충돌입니다 :

  • 내 self.viewController NSMutableArray에서 정확하게 메모리를 해제합니까?
  • superView (MainViewController 뷰)에 놓은 각 컨트롤러의 뷰는 removeObjectAtIndex : pageNumber를 self.viewControllers에서 해제 할 때 해제합니까? 할 수 있을까요? 내 문제입니까?

고맙습니다.

편집 :

Firoze Lafeer 처음에 바로 것처럼, 문제는 유지 제를 UIImage 메모리 관리 및 나의 전망했다 보인다. 난 단지 각 UIViewFromSuperview를 제거 할 수 있습니다. 이미지의 경우, [UIImage imageNamed]을 사용하는 것처럼 보입니다. 이는 캐시를 구현합니다 (ios가 원하는 경우이를 해제합니다). 난 그냥 캐시를 구현하지 않는 내을 사용하는 방법을 변경하고 내 모든 개체는 지금 행복합니다. 감사합니다 여러분. :)

답변

0

오른쪽으로 스크롤보기에 각보기를 추가하면 스크롤보기에 해당보기가 유지됩니다. 따라서 각 페이지를 언로드 할 때 각보기를 제거해야합니다.

나는보기 컨트롤러 자체가 전혀 메모리를 차지하지 않는다는 것을 알게 될 것입니다. 견해가 더 큰 문제입니다.

+0

보기에 여러 개의 하위보기가있는 경우 각 하위보기를 제거해야합니까? ... 실제로 실제로 넣은 scrollView에서보기를 제거하지만 메모리가 줄어들지는 않습니다. 어떤 생각? – Linnk

+0

보기를 제거하면 모든 하위보기뿐만 아니라보기 계층 구조도 제거됩니다. 뷰가 아직 할당 해제되지 않은 경우, Instruments에서 이력을 확인해야합니다. 사실, 당신은 인스트루먼트를 사용하여 이것이 당신의 기억이 가장 먼저 떠오르는 곳인지를 확인할 수 있습니다. 보기에 이미지를로드하는 경우 올바르게 관리하고 있습니까? –

+0

인스트루먼트의 어떤 구성 요소가이를 수행 할 수 있습니까? – Linnk

0

코드의 나머지 부분은 예상대로 작동해야하지만이 두 줄은 맞지 않을 수 있습니다.

[self.viewControllers removeObjectAtIndex:pageNumber]; 
    [self.viewControllers replaceObjectAtIndex:pageNumber withObject:[NSNull null]]; 

첫 번째 줄은 개체를 제거하고 위에있는 모든 색인을 하나씩 줄이므로 배열이 하나 작아집니다. 그런 다음 제거한 객체보다 한 번 높은 색인 인 객체에서 replaceObject를 호출합니다. 이 두 줄의 코드는 배열의 실제 길이를 전달할 때 범위를 벗어날 때까지 호출 될 때마다 배열의 크기를 1 줄입니다. removeObject 줄을 제거하고 replaceObject는 해당 객체를 해제합니다. 배열을 동일한 크기로 유지하면서 자신의 것입니다.

이렇게하면 유지 카운터를 같은 방식으로 감소시키기 때문에 문제가 해결되지 않을 수 있습니다. 아마도 이러한 메서드를 호출하는 코드를 게시하는 데 도움이됩니다.

+0

네가 맞아.하지만 네, 사실이게 내 문제를 해결하지 못해요. – Linnk

관련 문제