standwally

viewDidUnload의 호출 시점과 역할 본문

프로그래밍/iOS

viewDidUnload의 호출 시점과 역할

standwally 2013. 1. 26. 21:24

 도대체 viewDidUnload라는 것은 무슨 일을 하며 언제 호출되는 메세지일까? 내 경험에 의하면 상당히 리소스가 많은 어플리케이션을 디버깅 하면서 언뜻 이런 상황이 발생했었던 것이 기억난다. 어플리케이션을 어느정도 사용하다 보면 “Received memory warning.”이라는 메세지가 쌓이면서 강제 종료되는 현상이 발생한다. 비슷한 상황에서, 현재 활성화된 UIViewController에서 메모리 경고 메세지가 발생한 다음, 비활성화 되어 있던 이전 UIViewController로 돌아갔을 때, loadView와 viewDidLoad 메세지가 다시 호출되는 경우를 보았다.
 궁금해서 애플 개발자 문서를 참고해보니, viewDidUnload 메세지는 dealloc 메세지의 호출 결과로 발생하는 것이 아니라는 것이며, 메모리 경고에 따라 현재 비활성화 되어 있는 UIViewController 객체의 UIView객체가 사용하지 않는 상태이면 nil값으로 설정되면서 viewDidUnload가 호출된다는 것이다. 그러면서 nil값으로 셋팅된 UIView 객체를 가지고 있던 UIViewController 객체가 비활성화 상태에서 활성화 상태로 돌아올 때는 이미 UIView객체가 해제된 상태이기 때문에, loadView와 viewDidLoad로 화면을 다시 구성하게 되는 것이다.
 하지만 iOS 6.0부터는 내용이 변경되었다. viewDidUnload는 더 이상 사용하지 않으며, 메모리 경고가 발생하더라도 기본적으로 뷰를 제거하지 않는다는 것이다. iOS에서 메모리 경고를 발생시킬때 UIViewController가 받는 메세지는 아래와 같다.

- (void)didReceiveMemoryWarning;

 결론적으로 viewDidUnload와 연관이 있는 didReceiveMemoryWarning를 포함한 이 두 개의 메세지는 어플리케이션의 메모리 사용으로 인해 어플리케이션에 끼치는 영향에 대한 이슈와 관련있는 것 들로 볼 수 있겠다. 메모리 경고가 발생하게 되면, 현재 비활성화 되어있는 UIViewController객체들에게 우선적으로 뷰를 메모리에서 해제시켜 버리기 때문에, 우리는 앞으로 메모리의 효율적인 관리를 위해서 현재 아이폰 화면에 보여지는 것 외에 다른 뷰들은 굳이 부모뷰에 붙여놓을 필요가 없다는 것이다. 비활성화된 UIViewController의 뷰들은 부모뷰에서 떼어놨다가, 메모리 경고를 받으면 그때 nil값이 셋팅되게 함으로써 불필요한 메모리를 효율적으로 관리해야 한다는 것이다.