화면에 보이는 것을 View
라고 표현한다. 예를 들어 화면에서 항목을 선택하면 새로운 화면이 나타난다. 이러한 과정에서 화면이 태어나고 사라지기(죽기까지)의 과정을 Life Cycle
이라 표현한다.
나타난다 (태어난다)
와 사라진다 (죽는다)
의 기준은 무엇일까?View
의 생명주기: View Instance
의 생명 주기, View Instance
가 메모리에 올라갔다 (태어났다), 메모리에서 사라진다 (죽는다).View
의 생명주기 관리는 View Controller
가 한다. UIViewController
문서를 참고하자.
View Controller
가 View
를 가지게되는 순간 (View가 탄생하는 시점)은?뷰 컨트롤러에서 loadView()
메서드를 통해 뷰를 불러올 때
View
의 상태 변화에 따라 ViewController
에 있는 특정 메서드를 호출한다.
viewWillAppear
viewDidAppear
viewWillDisappear
viewDidDisappear
뷰의 상태는 두 가지가 있다. 보인다. 안보인다. 이 시점에 기반하여 위의 메서드들을 정의해두었다. 그렇다면 우리는 왜 이 시점을 알아야 할까? 왜 상태를 나누어 두었을까?
그 이유는 이벤트가 발생했을 때 반응하기 위한 코드를 준비하기 위함이다. 화면이 나타나고 없어지는 것도 이벤트의 일종이다. View
의 자세한 Life Cycle은 아래와 같이 시점별 (시간순)로 정의되어 있다.
loadView()
: View를 메모리에 로드한다.viewDidLoad()
: View가 메모리에 로드되었다(DidLoad).viewWillAppear()
: View가 나타날 것이다(WillAppear).viewDidAppear(_:)
: View가 나타났다(DidAppear).viewWillDisappear(_:)
: View가 사라질 것이다(WillDisappear).viewDidDisappear(_:)
: View가 사라졌다(DidDisappear).예시로써, Navigation Controller
에서 back 버튼
을 통해 머무르던 화면에서 나오면 들어갔던 화면은 메모리에서 해제된다 (viewController type deinit()
).
이전 화면으로 이동하는 기능을 segue
로 이어 순방향 segue
와 순환되게 구성하면 화면을 들어가고 나갈 때마다 계속 새로운 화면을 만들게 된다. dismiss
를 통해 기존 화면으로 돌아가는 기능을 구현하자.
present modally
효과로 화면을 넘길 때 화면을 일부 덮는 기본 설정
과 full screen으로 설정
함에 따라 ViewController
의 메서드 작동 양상이 다르다 (상기 언급한 메서드들). 기본 설정은 기존 화면이 살아있기 때문에 애니메이션, 음악 재생이 계속 일어나고, full screen
으로 덮으면 기준 view
가 사라진다.
그렇다면 음악과 애니메이션은 어디에서 재생하는 것이 좋을까?
viewDidload()
viewDidAppear()
- 여기!viewDidLoad()
viewDidLoad()
는 다른 화면에 다녀오면 음악과 애니메이션이 다시 재생되지 않는다.
이처럼 화면 전환에 따라 특정 메서드들의 호출 시점이 다르기 때문에 잘 알고 써야한다!
추가 팁으로는 다른 화면에 다녀올 때마다 새로운 데이터를 업데이트 해주어야 하는 경우 viewWillAppear()
에서 처리하도록 한다.