2013-04-05 1 views
0

다른 viewController를 추가하는 UIPageViewController가 있습니다. viewControllers 내 배열에 추가 한 후UIPageViewController에서 viewController 언로드

 [viewControllersArray addObject: infoViewController]; 

: 그 ViewControllers 내가이 같은이 배열에 viewControllers를 추가 viewControllersArray = [[NSMutableArray alloc] init]; 배열에있는이 위의 코드는 모두에서의 viewDidLoad에서 이루어집니다

NSArray *initialViewControllers = [[NSArray alloc] initWithObjects:[viewControllersArray objectAtIndex:0], nil]; 
[self setViewControllers:initialViewControllers 
       direction:UIPageViewControllerNavigationDirectionForward 
       animated:YES 
       completion:^(BOOL finished){ 
        NSLog(@"call back success");}]; 

내 UIPageViewController.

로드를 들어 내가 가진이 배열은 그 기능이 같은 사용 <UIPageViewControllerDataSource> 을 형성 :

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { 
    if ([viewControllersArray containsObject:viewController]) { 
     NSInteger index = [viewControllersArray indexOfObject:viewController]; 
     if (index < [viewControllersArray count] && index > 0) { 
      return [viewControllersArray objectAtIndex:(index - 1)]; 
     } 
    } 
    return nil; 
} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { 
    if ([viewControllersArray containsObject:viewController]) { 
     NSInteger index = [viewControllersArray indexOfObject:viewController]; 
     if (index < [viewControllersArray count] - 1) { 
      return [viewControllersArray objectAtIndex:(index + 1)]; 
     } 
    } 
    return nil; 
} 

이제 문제가 무엇인지, 당신이 슬쩍 때, 다음 viewcontrollers 부하 등하지만를 얻을 수 있다는 것입니다 언 로딩하지 마라. 그래서 메모리를 절약하기 위해 이미 통과 한 뷰 컨트롤러를 언로드하는 방법을 찾고 있습니다. 다시 스 와이프하면 다시로드됩니다.

답변

3

문제는 사용자가 viewControllersArray의보기 컨트롤러를 잡고 있다는 것입니다. 배열에는 추가 한 각 객체에 대한 강력한 참조가 들어 있습니다. 메모리를 절약하는 가장 쉬운 방법은 pageViewController:viewControllerBeforeViewController:pageViewController:viewControllerAfterViewController: 데이터 소스 방법 모두에서 요청 된보기 컨트롤러를 즉시 작성하는 것입니다. 그렇게하면 페이지 뷰 컨트롤러 만보기 컨트롤러에 대한 강력한 참조를 가지게되고 화면 밖으로 이동하면 해제됩니다.

즉시 작성하는 것이 너무 비싸다면 어레이에 3 개의 뷰 컨트롤러를 유지하는 것, 즉 현재 표시된 컨트롤러와 즉각 왼쪽과 바로 오른쪽에있는 컨트롤러를 유지하는 것을 고려할 수 있습니다.

예 :

- (UIViewController *)pageViewController:(UIPageViewController *)pvc 
     viewControllerBeforeViewController:(MyGreatViewController *)vc 
{ 
    NSUInteger index = vc.position - 1; //custom property on your VC 
    if (index > 0) { 
     return [[MyGreatViewController alloc] initWithPosition:index]; 
    } 

    return nil; 
} 

- (UIViewController *)pageViewController:(UIPageViewController *)pvc 
     viewControllerBeforeViewController:(MyGreatViewController *)vc 
{ 
    NSUInteger index = vc.position + 1; //custom property on your VC 
    if (index <= MAX_POSITION) { 
     return [[MyGreatViewController alloc] initWithPosition:index]; 
    } 

    return nil; 
} 

을 즐기십시오!

+0

"그 (것)들을 즉시 창조하십시오"당신은 무엇을 의미합니까? 모든 viewcontrollers for 루프를 사용하여 클래스에 대한 viewDidLoad 메서드를 추가하고 배열에 추가합니다. –

+1

내 수정 된 답변보기 뷰 컨트롤러 _once를 alloc-init하기 만하면됩니다. 미리 배열에 모든 것을 추가하지 마십시오 : 사용자는 결코 그것을 스 와이프하지 않을 수 있으며 뷰 컨트롤러를 볼 필요가 없을 수도 있습니다. 데이터 소스 메소드에서 실제로 필요한 경우에만이를 작성하십시오. –

+0

정확히 무슨 뜻인지 잘 모르겠습니다. 작은 샘플 프로젝트를 만들었습니다. http://www.2shared.com/file/rbsxMLgz/pageScroll.html 어떻게 모든 viewController를 추가하는지 보여줍니다. 이 방법을 사용하는 것은 좋지만 오른쪽으로 스 와이프하면 다음 페이지가 추가되지만 UIPageViewController에서 제거되지 않고 메모리에 유지됩니다. –

0

View Controller를 언로드하지 마십시오. 메모리가 부족하면 컨트롤러가 뷰를 언로드합니다. 코드에서 -(void)viewDidUnload-(void)didReceiveMemoryWarning (iOS 6)을 사용하여 리소스를 확보하십시오. UIPageViewController가 일부 페이지를 표시하면 컨트롤러는 언로드 된 뷰를 다시 만들고 -(void)viewDidLoad을 호출합니다 (컨트롤러를 수동으로 사용자 정의하는 경우).

+0

이미 didReceiveMemoryWarning을 구현했고 뷰를 nil로 설정했지만 많은 메모리를 해제하지 않았습니다 –

+0

@autoreleasepool 블록을 떠날 때 메모리가 완전히 해제되었습니다 (main.m에 하나만있는 경우). 프로그램이 닫히면 해제됩니다. 당신은 너무 많은 메모리를 할당하는 코드에서 자신의 autorelease 블록을 추가 할 수 있습니다. – FunkyKat

관련 문제