2010-06-04 4 views
4

내부에 5 개의보기 컨트롤러가있는 탐색 컨트롤러 기반 응용 프로그램이 있습니다. 뷰 컨트롤러를 밀 때 메모리를 일부 할당하고 popViewController로 돌아 가면 delloc() 메서드가 올바르게 호출됩니다. 나는 dealloc이 push and pop하는 모든 뷰 컨트롤러에 대해 올바른 방법으로 호출된다고 확신한다.컨트롤러 팝업시 UINavigationController 메모리가 감소하지 않습니다

그럼에도 불구하고 Instrument (성능 도구 -> Object allocation, Leaks로 시작)로 응용 프로그램을 실행할 때 이상한 동작이 발생합니다. 보기 컨트롤러가 팝업되면 메모리 사용량이 줄어들지 않아 예상대로 줄어들지 않습니다. 응용 프로그램을 시작할 때 950KB를 사용하면 첫 번째보기 컨트롤러와 메모리 사용량이 최대 1까지 증가합니다 , 56 메가 바이트, 마침내 나는보기 컨트롤러를 팝하고 메모리 사용량은 이제 1,55 메가 바이트입니다.

이 동작이 맞습니까? 모든 dealloc 메서드는 뷰를 팝하고 Leaks 악기가 메모리 누수를 나타내지 않을 때마다 올바르게 호출됩니다. 운영체제가보기를 어떤 식 으로든 "보기"유지하므로 두 번째로 동일한보기 컨트롤러를 누르는 동안로드 프로세스가 훨씬 빠릅니다 ...

누군가이 동작이 올바른지 확인할 수 있습니까? 감사

See this Screenshot from Instruments

+0

Ps. 인스트루먼트는 X 초마다 또는 수동으로 누출 여부를 확인하도록 설정되어 있습니까? – RickiG

+0

자동으로 10 초마다 확인하도록 설정되어 있습니다. 뭔가 바뀌 었니? – ggould75

답변

6

이 예상되고있다. "할당 한 객체에 대해서만 책임을지고 복사 등"의 메모리 처리 규칙은 여기에도 적용됩니다. 당신이있는 navigationController에게 물건을 누르면

난 당신이 이런 식으로 그것을 할 가정

MyController *myCon = [[MyController alloc] init]; 
[self.navigationController pushViewController:myCon animated:YES]; 
[myCon release]; //You have alloc and release. 

가있는 navigationController 수시로 위치를 사용자 데이터 세트 아래로 드릴, 최대 다시 계층 구조를 처리한다. 메모리가 충분할 때 컨트롤러를 잡고 있으면 네비게이션 컨트롤러가 5 초 동안 컨트롤러를 다시 인스턴스화하지 않아도됩니다. 나중에 사용자가 "뒤로"도청 할 때. dealloc은 결코 호출되지 않기 때문에 이것을 볼 수는 있지만, 백업 할 때 viewWillAppear 및 viewDidAppear가 호출됩니다. 메모리가 부족하면 navigationController가 스택에서 컨트롤러를 해제하기 시작합니다.

하지만! 앞뒤로 이동해도 viewController가 반복해서 인스턴스화되지 않도록하십시오. 그러면 메모리 공간이 커지고 누수가 발생합니다. navigationController는 이미 viewController가 스택에 있고 단순히 표시한다는 것을 알아야합니다.

모든보기를 통과 할 수 있어야하며, 메모리에 "맞을"경우 앱은 절대 여기에서 메모리 풋 프린트를 늘려서는 안됩니다.

+0

답장을 보내 주셔서 감사합니다. 내가 설명한대로 뷰 컨트롤러를 인스턴스화합니다. 내가 잘 이해한다면, 뒤로 버튼을 두드리면 내비게이션 컨트롤러는 dealloc 메서드가 호출되었다고해도 내 컨트롤러를 "보유"할 것이라고 생각할 수 있습니다. 맞지? 내 dealloc은 항상 호출되기 때문에 (nslog를 사용합니다). 제가 잘 이해하지 못한다는 점은 이미 할당 해제 된 컨트롤러가 어떻게 유지 될 수 있는가하는 것입니다. 또는 컨트롤러 내부의보기가 유지됩니까? – ggould75

+0

앞뒤로 이동해도 viewController가 반복해서 인스턴스화되지 않는다는 것을 어떻게 확인할 수 있습니까? 내 뷰 중 하나를 다시 클릭하면 내비게이션 막대가 변경되지만 뷰는 변경되지 않습니다. 왜? – ma11hew28

+0

은 @RickiG를 의미합니다. 관찰이나 문서에서 이러한 행동에 대해 배웠습니까? –

관련 문제