세트

0

내 iOS 앱은 탐색 기반의 다음과 같은 구조입니다.세트

ViewControllerA에 보존되는 모든 내용은 ViewControllerAviewDidUnload에 nil로 설정해야합니다. 하위보기 컨트롤러에도 동일한 작업을 수행해야합니까? 이처럼 : viewControllerC에서 시작 "을 수상 메모리 경고"있을 때

-(void)viewDidUnload 
{ 
    self.viewControllerB=nil; 
    self.viewControllerC=nil; 
} 

나는 문제를 발견했다. 그 후 상위 뷰 컨트롤러의 viewDidUnload (즉, viewControllerA)이 호출되어 nil이 'viewControllerB'로 설정되었습니다. 예기치 않게 viewControllerB의 viewDidUnload도 호출됩니다. 그래서 viewControllerB의 서브 뷰 (의 viewDidUnload)로 nil을 설정하면 "할당 해제 된 객체로 메시지가 전송되었습니다"라는 메시지가 나타납니다.

자식 뷰 컨트롤러에 nil을 설정해서는 안된다는 뜻입니까? 이 상황에서 메모리 관리에 가장 적합한 방법은 무엇입니까?

P. ARC를 사용합니다.

답변

1

viewDidUnload으로 전화 한 후 UIViewController은 상태를 유지해야합니다. 즉, 쉽게 다시 생성 할 수없는 모든 것을 해제하지 않아야합니다. 일반적으로 뷰 계층 구조와 관련된 모든 데이터 (예 : viewDidLoad에 생성 된 일부 하위 뷰 또는 사용자 정의 데이터에 대한 강력한 참조)를 nil로 설정합니다. 예를 들어, 부모 컨트롤러 A는 viewDidUnload이 호출 된 후에 복구 할 수 있어야합니다. 즉, 나중에 viewDidLoad이 호출되면 컨트롤러가 복원되고 충돌하지 않습니다.

또한 모든보기 컨트롤러는 메모리 경고 알림을 위해 등록되므로 메모리 경고가 발생하면 현재 표시되지 않은 모든보기를 언로드 할 수 있습니다. 보기 컨트롤러가 호출되는 순서가 결정적인지, 예를 들어 상위보기 컨트롤러에서 시작되었는지 알 수 없으므로 부모 컨트롤러 viewDidUnload에 중첩 된 UIViewController을 nil로 설정할 때주의해야합니다.

그러나 viewDidUnload 이후 컨트롤러의 상태를 유지해야하므로 하위 컨트롤러를 nil로 설정하면 안됩니다. 컨트롤러 하위 뷰 (예 : UILabel에 대한 강력한 참조 등)에 대한 모든 강력한 참조를 포기하지만 컨트롤러 자체를 포기하지 않아야합니다.