2012-06-25 2 views
3

iPad 용 대화 형 책을 만들고 UINavigationController을 사용하여 페이지와 다음 페이지 사이의 탐색을 구현하고 있습니다. 사용자가 페이지를 넘길 때 다음 페이지가 탐색 스택 맨 위에 푸시됩니다.UINavigationController에서 많은보기 컨트롤러를 푸시 할 때 메모리 문제가 발생했습니다.

14 페이지에서 15 페이지로 이동할 때 앱이 15 페이지가됩니다. 콘솔에서 오류 메시지가 표시되지 않고 기기의 오류 로그에는 아무 것도 표시되지 않습니다.

스토리 보드의 각보기 컨트롤러의 장면에는 이미지가 5MB에서 20MB 사이 인 UIImageViews이 표시됩니다. 뷰 컨트롤러의 viewDidLoad 메서드는 한 번만 호출됩니다. 모든 앱의 전체 자산 크기는 200B 미만입니다. ARC를 사용하고 있습니다.

저는 Instruments의 Memory Monitor를 사용하여 앱을 실행했습니다. 앱의 실제 메모리 사용량은 새 페이지가 바뀔 때마다 약 80MB 증가하고 800MB에 도달하면 충돌합니다 (기기가 iPad 3 임).

  • 왜 엄청난 메모리가 소비 되었습니까? Storyboard의 장면에있는 UIImageView가 이미지를 캐시하기 때문에 이것이 발생 했습니까?

  • UINavigationController과 ARC를 사용할 때 메모리를 확보하는 가장 좋은 방법은 무엇입니까?

는 I 뷰 컨트롤러 ' viewDidDisappear: 방법 닐 모든 뷰 컨트롤러의 파단 부가 설정했지만, 메모리 소모가 동일한 머물렀다.

답변

6

UINavigationController를 사용하면 사용자가 특정 ViewController에서 뒤로 버튼을 누르지 않으면 푸시 한 각 ViewController를 메모리에 영구히 유지합니다 (앱이 종료 될 때까지). 그것은 ViewController 스택을 유지합니다.

따라서 간단한 대답은 입니다.이에 대해 UINavigationController를 사용하지 마십시오. 나는 다음과 이전 페이지 인 '알고있는'자신 만의 ViewController를 작성하여 필요할 때 수동으로로드하고 제거하는 것이 좋습니다. 이 방법을 사용하면 한 번에 한 페이지 만 메모리에 저장할 수 있습니다 (전환 중에는 제외). http://cocoacontrols.com/platforms/ios/controls/xbpagecurl 전환에이 애니메이션을 사용할 수 있습니다.

+0

나에게 UIPageViewController와 비슷한 소리가납니다. – LightningStryk

2

아마도이 목적으로 UINavigationController를 사용하고 싶지 않을 것입니다. 하나의보기 컨트롤러가 모든 페이지를 관리하고 이전 페이지를 제거하면서 같은 페이지에서 새로운 페이지를 렌더링하게하는 것이 좋습니다.