2

UITabBarController를 기본 탐색 양식으로 사용하여 응용 프로그램을 만들고 있습니다. 문제가 발생하기 전에는이 작업을 한 번도 해보지 않았습니다.UITabBarController 메모리 경고 후 뷰를 할당 해제합니다.

네 개의 탭 중 두 개에서보기 컨트롤러는 표준 탐색 컨트롤러를 사용하여 드릴 다운하고 범주를 탐색 한 다음 항목을 탐색합니다. 카테고리와 항목은 꽤 많은 이미지를 가지고 있습니다. 내가 도착 (4 개 320x460 이미지있는 ScrollView를 사용하는 항목 단계까지) 내 응용 프로그램을 사용하여 몇 분 후

..
Received memory warning. Level=1 

다음 할당을 취소 뷰의 모든 현재에서 열리는 제 UITabBarController를 클릭하고 탭을 클릭하면 흰색 화면 만 표시됩니다.

이미지를 사용하는 경우, 내가 사용하려고

는 ..

UIImageView *imageView = [[[UIImageView alloc] init] autorelease]; 
[imageView setImage:[UIImage imageNamed:@"image"]]; 
[self.view addSubview:imageView]; 

..as 가능한 한 많이, 지금까지 내가 알고 있어요로서, 그 '메모리 관리', 그리고 제대로 할당 해제해야합니다.

메모리 문제는 단순히 메모리에로드되는 4 개의 큰 이미지로 인한 것일뿐입니다. 이는 내 앱의 요구 사항입니다. 탭이 사라지는 것은 아닙니다 :/

아이디어 가이던스?

+0

난 당신이있는 viewDidLoad 및 viewDidUnload의 가치를 오해 생각합니다. 또한 언제든지 자동 릴리스 풀을 제거하고 수동 보유/릴리스 수 관리를 수행해야합니다. 귀하의 경우 그것은 다소 쉽습니다 : UIImageView * imageView = [[UIImageView alloc] init]; [imageView setImage : [UIImage imageNamed : @ "image"]]; [self.view addSubview : imageView]; [imageView release]; –

답변

3

이것은 의도적으로 설계된 것입니다. 앱에 메모리 경고가 수신되면 현재 표시되지 않은 모든보기 컨트롤러는보기를 언로드합니다. 당신은 그것에 대비해야합니다. 사용자가 언로드 된 탭을 다시 열면 뷰 컨트롤러가 뷰를 다시로드하고 뷰 설정을 수행해야하는 곳인 -viewDidLoad을 다시 호출합니다.

+0

감사합니다. 대답을 알았을 때 간단합니다! 나무의 나무를 볼 수 있도록 도와 주셔서 감사합니다. – Bongeh

+0

보기가 XIB에서로드 된 경우 어떻게됩니까? 이전에 viewDidLoad를 호출 할 때 할당 한 모든 객체는 어떻습니까? 이러한 할당을 모두 다시 수행하면 이전 인스턴스를 모두 유출하게됩니다. – Oscar

+0

@Oscar : NIB는 차이를 만들지 않습니다. 과정은 완전히 동일합니다. 메모리를 낭비하거나 누설하지 않으려면'viewDidUnload' 메소드에서'viewDidLoad'에 할당/보존 한 모든 것을 릴리즈해야합니다. 문서에 자세히 설명되어 있습니다. –

1

올레는 괜찮은 설명을했습니다. 한 가지 방법은 오프 스크린보기 컨트롤러의보기가 언로드 된 경우 -loadView에 다시 설정해야합니다. 뷰 계층 구조를 설정하기 위해이 메서드가 호출 된 다음 -viewDidLoad이 호출되어 뷰가 준비되었음을 알립니다. -viewDidLoad에 구현하면 빈 뷰 (UIViewController -loadView)가로드 된 다음 깜박임이 발생하여 -viewDidLoad 코드로 바뀝니다. 귀하의 의견로드에 대한

이보다 더 정교한 설명은 여기에 있습니다 : http://myok12.wordpress.com/2010/11/30/custom-uiviewcontrollers-their-views-and-their-memory-management/

+0

XIB에서 화면을로드하는 경우 loadView를 재정의하지 않습니다. – Oscar

관련 문제