0

이 질문은 코어 데이터와 함께 Xcode의 마스터 세부 템플릿을 사용하는 iPhone 앱과 관련된 것입니다. 이 앱은 iOS 5.1 이상을 지원합니다.보기 컨트롤러가 메모리에서 해제되는지 어떻게 알 수 있습니까?

저는 NSFetchedResultsController를 사용하여 UINavigationController 스택의 두 번째보기 컨트롤러 인 UITableView의 항목을 관리하고 있습니다. 사용자가 테이블 뷰에서 선택하고 스택의 세 번째 뷰 컨트롤러가 뷰에 푸시됩니다. 꽤 표준적인 것, 그리고 NSFetchedResultsController가 제공하는 코어 데이터 객체에 대한 훨씬 단순화 된 액세스를 즐기고 있습니다.

세 번째보기 컨트롤러에 들어가면 사용자는 테이블보기의 목록에서 선택한 데이터 집합을보고 있습니다. 이전 또는 다음 데이터 집합으로 이동하기 위해이보기에 몇 개의 단추를 추가했습니다. 이메일을 볼 때 표시되는 iOS Mail 앱과 위/아래 버튼을 생각해보십시오. 이 단추를 사용하여 전자 메일의 목록 (테이블보기)으로 돌아 가지 않고 목록에서 다음 또는 이전 전자 메일을 선택할 수 있습니다.

다음/이전 버튼 중 하나를 탭하면 데이터 저장소에서로드해야하는 데이터를 식별하는 가장 간단한 방법을 찾으려고했습니다. 지금까지 내가 알 수있는 한, 이것은 스택의 이전 뷰 컨트롤러에서 가져온 결과 컨트롤러를 사용하는 것입니다. 코어 데이터에 테이블 뷰의 다음 또는 이전 인덱스 경로에 대한 결과를 반환하도록 요청할 수 있습니다. 다음과 같이 세 번째 (세부 사항) 뷰 컨트롤러에 내가 두 번째 (마스터) 뷰 컨트롤러의 가져온 결과 컨트롤러에 대한 액세스를 얻을 수 있어요 동안

: 나는 더 이상 갈 전에

NSFetchedResultsController *fetch = [[self.navigationController.viewControllers objectAtIndex:1] fetchedResultsController]; 
NSIndexPath *indexPath = [fetch indexPathForObject:self.detailItem]; 
NSLog(@"Section: %d, Row: %d", indexPath.section, indexPath.row); 

, 내가 필요 뷰 컨트롤러와 페치 된 결과 컨트롤러가 항상 주위에 있다는 것을 알아야합니다. 내가 그것을 이해함에 따라, 그것은 메모리가 부족해질 때까지 유지 될 것이고, 그 시점에서 그것을 풀 수있을 것이다. 내 세부 정보 뷰는 데이터를 표시 할 때 많은 메모리를 소비 할 수 있으며 앱이 시간이 지남에 따라 더 많은 데이터를 수집하는 데 점점 더 많이 사용됩니다.

사용자가 세부보기 컨트롤러와 상호 작용하는 동안 이러한 항목 (스택의 이전보기 컨트롤러와 가져온 결과 컨트롤러)이 메모리에 남아있을 수 있습니까?

그렇지 않은 경우 보유 여부를 확인할 수있는 방법이 있습니까?

그렇지 않으면 나를 달성하기위한 더 간단하고 우아한 방법이 있습니까?

답변

0

두 번째보기 컨트롤러는 절대로 출시되지 않습니다. 또한 메모리가 부족한 상황이 아닙니다. 낮은 메모리 상황에서 viewDidUnload (더 이상 사용되지 않으며 iOS 6에서는 더 이상 호출되지 않음)이 호출 될 수 있습니다. 그래서 당신이 그 방법에서 당신의 NSFetchedResultsController을 제거하지 않는 한 당신은 잘되어야합니다.

+0

을! 그것을 확인하는 (문서 등에서) 가리킬 수있는 것이 있습니까? 감사. – beev

+0

우선'viewControllers' 속성이 유지됩니다 ('copy'). 따라서 네비게이션 컨트롤러에 밀어 넣은 모든 뷰 컨트롤러는 유지되고 유지 된 개체는 절대 할당 해제되지 않습니다. 이러한 컨트롤러를 출시한다면 커다란 문제가 발생할 것입니다. 왜냐하면 할당되지 않은 컨트롤러로 다시 이동할 때 앱이 무엇을 할 것이기 때문입니까? – lammert

0

이 메소드를 호출하면 알 수 : true의 경우 매우 안심입니다

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 
관련 문제