모든 View Controller 객체의 상위 클래스는 UIViewController이다.
UIViewController는 뷰의 내용을 업데이트하고, 뷰와 사용자의 상호 작용에 응답하고, 기본 데이터의 변경에 대한 응답으로 뷰의 콘텐츠를 업데이트하고, 뷰 크기 조정 및 전체 인터페이스의 레이아웃을 관리한다.
ViewController 객체 생성
View를 메모리에 로드
Controller가 메모리에 로드된 뒤 호출
뷰가 나타나기 전에 호출
최초 한 번 실행(pop되어 다시 뷰가 띄어질때는 실행되지 않음)
View가 표시되기 직전에 호출
View가 나타날 때 마다 실행
View가 표시된 후 호출
View에 적용할 애니메이션 작업을 추가하면 좋다
View가 사라지기 직전 호출
View1 > View2 > View1 형태로 View가 전환된다면 다음 순서로 진행
View2가 표시할 준비가 되면 이후 View1이 사라집니다.
View가 사라지기 직후 호출
뷰 전환 시 순서
View1 viewWillDisappear
View2 viewDidLoad
View2 viewWillAppear
View1 viewDidDisappear
View2 viewDidAppear
View가 메모리에서 해제된 뒤 호출
Model은 앱이 무엇을 할것인지 비즈니스 로직을 처리하는 역할이다.
Controller는 모델이 어떻게 처리할 지를 알려주고, 사용자의 이벤트를 받아서 처리하고 Model과 View에 업데이트 요청을 한다.
View는 최종 사용자에게 보여주기 위한 역할이다.
MVC한계: 뷰와 모델이 서로 의존성을 띄게 된다. 사진에서 3,4번의 역할이 모델 -> 뷰 로 이어지면서 MVC 패턴에서는 의존성을 갖게 된다. 즉, 뷰에 복잡한 데이터의 구성이 표현된다면 Controller에 다수의 Model과 View가 복잡하게 연결되는 상황이 생길 수 있다.
왜 Hashable은 Equatable을 상속해야할까? hashValue는 고유값이어야 하므로 고유값인지 식별해 줄 수 있는 "==" 함수가 필요하다. 그 함수는 Equatable 프로토콜 안에 들어있다. 따라서 Hashable이 Equatable을 상속해야 한다.
Equatable은 값의 비교가 가능함을 보장해주는 프로토콜이다. 이 프로토콜을 채택한 타입들은 == 연산자나 != 연산자를 사용해 값을 비교할 수 있다. Array에서 contains(_:) 메소드를 사용할 수 있는 것도 Array가 Equatable 프로토콜을 채택하고 있기 때문이다.