View Controller Lifecycle | CodePath iOS Cliffnotes
init(coder:)
- When it is called / When it is used :
ViewController
는 일반적으로 스토리보드에서 생성이 된다. 이 경우 init(coder:)
가 호출되는 initializer
이며 재정의해야 한다.
iOS 직렬화 API
를 사용하는 경우에만 필요한 NSCoder Instance
를 매개변수로 제공한다. 이것은 자주 사용되지 않으므로 매개변수를 무시해도 된다.
직렬화
는 디스크에 저장하거나 네트워크를 통해 보낼 수 있는 바이트 스트림의 객체를 변환하는 것이다.
- Application :
ViewController
의 초기화 단계에서 일반적으로 ViewController
의 lifecycle동안 필요한 리소스를 할당한다. 여기에는 네트워크 컨트롤러와 같은 모델 객체 또는 기타 보조 컨트롤러가 포함된다.
- 이전
ViewController
도 이러한 객체를 현재 객체에 전달할 수 있으므로 모든 ViewController
에서 항상 인스턴스화할 필요는 없다.
- Things to take care of :
- 이 시점에서
ViewController
의 View
가 아직 인스턴스화되지 않았음을 주의하라. UIViewController
의 view
속성을 통해 접근하려고 하면 loadView()
메서드가 호출된다. 이로 인해 예기치 않은 동작과 버그가 발생할 수 있으므로 수명 주기의 후반까지 View
에 접근하지 않는 것이 더 안전하다.
init(nibName:bundle:)
- When it is called / When it is used :
- 때로는 ViewController의 Interface를 스토리보드 대신 별도의 nib 파일에 저장하기로 결정할 수 있다. 예를 들어, 다른 구성원이 또 다른 구성원의 작업에 영향을 주지 않고 ViewController Interface를 변경해야 하는 대규모 팀에서 작업할 때 발생할 수 있다. 또한 스토리보드가 아직 존재하지 않았을 때 생성된 프로젝트가 있을 수 있으므로 모든 ViewController에는 자체 nib 파일이 칬다. 메인 스토리보드가 너무 커지기 시작하면 더 많은 스토리보드로 분할할 수 있다는 점을 명심하라. 별도의 nib파일에서 모든 ViewController를 이동할 필요는 없다.
- nib 파일에서 ViewController를 생성하면 init(coder:) 대신 이 initializer가 호출된다.
loadView()
- ViewController의 View를 생성하는 method이다. 코드에서 ViewController에 대한 전체 Interface를 빌드하려는 경우에만 이 메서드를 재정의한다. 타당한 이유가 없는 한 사용하지마라.
- 스토리보드나 nib파일로 작업하는 경우 이 방법으로 아무 작업도 수행할 필요가 없으며 무시해도 된다. UIViewController에서 구현하면 Interface 파일에서 Interface를 로드하고 모든 콘센트와 작업을 연결한다.
viewDidLoad()
Viewcontroller
의 View
가 메모리에 로드되고 난 직후에 호출되는 메서드
- 1회 호출되며 메모리 경고로
View
가 사라지지 않는 이상 다시 호출되지 않음
- 주로 뷰의 초기화 작업을 담당한다.
- 이 메서드가 호출되면 ViewController의 뷰가 생성되고 모든 내용이 제자리에 있다고 확신할 수 있다.
- Application :
- 이 메서드를 사용하여 사용자가 View 전에 데이터로 ViewController의 사용자 Interface를 채우는 것이 일반적이다.
- 또한 마지막에 사용자 Interface를 배치해야 하는 Background 활동을 시작하기에 좋은 장소이기도 하다.
- 일반적인 경우는 화면이 로드될 때 한 번만 수행해야 하는 Network Call이다.
- ViewController에서 사용되는 객체를 초기화하고 설정하기에 좋은 곳이다.
- viewDidLoad vs viewDidAppear :
- ViewController의 데이터를 업데이트하기 위해 반복해야 하는 경우(Background active / UI update / network call) viewDidAppear(_:)가 더 적합하다.
- Important thing to remember :
- 이 메서드는 ViewController의 life cycle 동안 한 번만 호출되므로 한 번만 발생해야 하는 작업에 사용한다. ViewController가 화면에 나타날 때마다 몇 가지 작업을 수행해야 하는 경우 다음 메서드가 필요하다
- 이 수명 주기 단계에서 View bounds는 최종적이지 않다.