iOS 앱을 개발하면서 상당히 중요한 부분이고, 잘 알고 사용해야 안전한 구동과, 원하는 WorkFlow를 수행시킬 수 있게 되는 부분이라 정리해보려고 합니다.
대부분의 iOS 개발자 분들이라면 다 알고계실 내용이지만, LifeCycle에 대하여 정리해 보도록 하겠습니다.
UIViewController는 display되는 모든 화면에 가장 기본이 되는 클래스입니다.
액정으로 보이는 대부분의 화면들은 UIViewController에 UIView에 구상된 UI에 따라 실제 기기에서 Display 됩니다.
그렇기에, 생명주기 및 어떠한 Method가 언제 불리고, 어떤 Method가 먼저 호출되는지를 잘 이해하고 적절하게 설계해야 완벽히 원하는 구동을 수행시킬 수 있습니다.
UIViewController를 생성하거나 상속받아 새로운 CustomViewController를 생성한다고 가정할 때, 기본적인 LifeCycle은 아래와 같습니다.
각 LifeCycle에 대한 설명은 다음과 같습니다.
- init() : 생성해야하는 UIViewController를 초기화 하고 객체를 생성(view 생성 전이므로 접근 시 nil)
- loadView() : UIViewController의 self.view를 만드는 메소드이며, storyboard나 nib을 통해 제작된 UIViewController의 경우 override를 권장하지 않으며, 필요에 의해 UIView를 직접 설정해 주어야 할 경우 사용.
- viewDidLoad() : 모든 Outlet들이 메모리에 할당되어 있는 상태로, UI에 대한 초기화를 보통 이 구간에서 처리함 ( UIViewController가 로드될 때 최초 1번만 호출되므로 반복적인 작업의 경우를 제외한 작업을 처리)
- viewWillAppear(_ animate:Bool) : Modal 혹은 Navigation Push 등 viewController가 실제 화면에 뿌려지기 직전에 호출되는 메소드로 화면이 노출될 때 마다 호출됨
- viewDidAppear(_ animate:Bool) : viewController의 View가 화면에 정상적으로 노출이 완료되면 호출됨
- viewWillDisappear(_ animate:Bool) : dismiss 나 pop, inactive 등, 현재 디스플레이 되어있는 View가 화면에서 사라지기 직전에 호출되는 메소드.
- viewDidDisappear(_ animate:Bool) : view가 화면에서 완전히 사라지면 호출됨
- viewDidUnload() : view가 메모리에서 해제되면 호출됨..이 아니라, didReceiveMemoryWarning 이 호출되면 호출되는 메소드.
위와같은 lifeCycle을 가지고 UIViewController는 생성되고 노출되며 해제됩니다.
lifeCycle을 제대로 이해하지 않고 사용하거나, 아무런 고려없이 사용하면서 발생되었던 개인적인 경험은 아래와 같습니다.
- NSNotificationCenter observing을 add 해주고 remove 해주는 곳을 짝이 맞지 않아서, 중복적인 observing을 하여, 비정상적인 구동을 하거나, remove가 제대로 되지 않은 채 살아있게 되어 비정상 종료가 발생한 경우,,(viewWillAppear와 viewWillDisappear 짝을 통하여 add, remove를 해주거나, viewDidLoad()와 dealloc()을 통하여 add,remove를 해주고 순환참조가 발생하여 dealloc()이 제대로 호출되지 않는 경우를 반드시 확인하여 사용)
메서드의 이해가 충분하지 못할 경우, ViewDidLoad()에서 add 하고, ViewDidUnload()에서 remove를 하는 경우를 심심치 않게 볼 수 있습니다..
2. Contents List 갱신을 viewWillAppear()에 넣어주어, 필요치 않은 갱신을 하게된 경우.. (각 상황에 맞게 API 를 리로드 해주어야 하는데 고려없이 작성하여 문제발생)
3. UIViewController를 init만 해둔 상태에서 view에 접근한 경우..비정상 종료
위 경우를 제외하고도 많은 이슈들이 발생할 수 있으니, 개발간에 다시한번 확인해보는 것이 좋을 것 같습니다.
감사합니다.