4

ARC를 사용하는 iOS-App이 있습니다. InterfaceBuilder를 사용하지 않으면 모든 UI가 수동으로 생성됩니다. 해당 응용 프로그램에서 SubViewController 함께 여러 UIViewControllers 있습니다. 이러한 ViewController는 스택에 푸시하는 메뉴 (-ViewController)에서 함께 연결됩니다.메모리가 ios보기 계층에서 해제되지 않았습니다.

제 문제는 ViewControllers간에 전환 할 때 메모리가 해제되지 않는다는 것입니다.

SubViewController에 대한 참조를 이와 같이 유지하는 것은 잘못 되었습니까?

@property (nonatomic, strong) UIViewController subViewController1; 
@property (nonatomic, strong) UIViewController subViewController2; 

viewDidUnload가 호출되지 않습니다. 누구나 깨끗한 뷰 계층 구조를 만드는 좋은 예가 있습니까?

+0

viewDidUnload는 메모리 부족 상태에서만 호출됩니다. – 0x8badf00d

답변

0

이것은 ARC와 아무 관련이 없습니다. viewDidUnload는 뷰 속성이 release/nil로 설정되어있을 때만 뷰 컨트롤러에서 호출되며 일반적으로 앱에서 메모리 경고를 받으면 발생합니다.

시뮬레이터에서 메모리 경고를 트리거하고 viewDidUnload 메소드가 실행되는지 확인하십시오. 만약 그렇다면 모든 것이 좋습니다. 그렇지 않다면 아마 다른 견고한 속성에 할당하여 아마 당신의 견해를 어떻게 든 지나치게 유지하고있을 것입니다.

보기 유지 정책에 예외가 있습니다. 예를 들어, UINavigationController는보기 컨트롤러 스택에서보기가 가장 앞에 있지 않은 경우보기를 해제하지만, 단순히 자식 컨트롤러의보기를 nil로 설정하면보기가 해제됩니다 다른 컨트롤러의 관점에서 다루고 있습니다.

화면에 표시되지 않을 때보기를 해제하려면 viewDidDisappear : 메서드에서 컨트롤러의 view 속성을 nil로 설정하거나보기가 화면 상에 나타나지 않고 새로운 컨트롤러 인스턴스를 표시해야 할 때마다 (즉 컨트롤러와 뷰가 모두 사용되지 않을 때 해제됩니다).

5

스택에 푸시 된 뷰 컨트롤러를 강력한 인스턴스 변수/속성에 할당하면 스택에서 튀어 나올 때 할당 해제되지 않습니다. 강력한 속성은 푸시 된 뷰 컨트롤러가 스택에서 튀어 나온 후에도 유지되므로 할당 취소 할 수있는 상태가되지 않습니다.

는 일반적으로 I는 탐색 스택에 다음 레벨 다운 뷰 컨트롤러를 밀어 때 다음과 같이 수행

SLSMoleculeSearchViewController *searchViewController = [[SLSMoleculeSearchViewController alloc] initWithStyle:UITableViewStylePlain]; 
[self.navigationController pushViewController:searchViewController animated:YES]; 

에서 ARC를, 새로운 뷰 컨트롤러가 할당됩니다 및 생성에 유지됩니다. 네비게이션 스택에 푸시되면 네비게이션 컨트롤러가 한 번 유지합니다. 이 새 뷰 컨트롤러는 푸시 된 후에 참조되지 않으며 강력한 속성 또는 인스턴스 변수에 할당되지 않으므로 ARC는 두 번째 줄 이후에이를 해제합니다.

아직 네비게이션 컨트롤러에 보관되어 있으므로 메모리에 계속 저장됩니다. 그러나 탐색 컨트롤러가 스택에서 꺼내면이보기 컨트롤러가 해제됩니다. 그 시점에서 아무 것도 붙잡고 있지 않기 때문에 예상대로 할당이 해제됩니다.

상위보기 컨트롤러에서이 하위보기 컨트롤러에 대한 참조를 유지해야하는 경우 weak 속성이나 __weak 인스턴스 변수를 사용할 수 있습니다. 이것은 뷰 컨트롤러에서 유지되지 않으며 일단 컨트롤러가 할당 해제되면 nil이됩니다.

weak 참조는 iOS 5.0을 대상으로하는 응용 프로그램에서만 지원되므로 iOS 4.0에서 실행해야하는 항목에 대해서는이 작업을 수행 할 수 없습니다. 4.0 호환 unsafe_unretained 속성은 내가 할당 취소 된 메모리에 대한 포인터의 위험 때문에이 경우 권장할만한 것이 아닙니다.

+0

감사합니다. 너무 많이 가져 주셔서 감사합니다. 가능한 한 빨리 풀기 위해 뷰 컨트롤러를 어떻게 작성해야합니까? – spamoom