본문 바로가기

면접질문정리

[iOS] View Life Cycle (feat. drawing cycle) 호출순서?

1️⃣ View Controller의 View의 상태변화에 따른 메서드의 호출순서를 이야기해보세요.

loadView() -> viewDidLoad() -> viewWillAppear() -> viewDidAppear()
-> viewWillDisappear() -> viewDidDisappear() 순서로 호출이 됩니다.

# 꼬리질문

# 각각의 메서드는 어떤 역할을 가지고 있을까?

loadView()

  • controller가 관리하는 view를 만드는 역할
    ex) customView를 mainView로 설정할때
    • 이 메소드 안에서 새로운 뷰를 만들어서 뷰 컨트롤러의 메인 뷰로 설정해줘도 된다.
    • 뷰 컨트롤러의 기본 뷰를 커스텀 뷰로 사용하고자 할 때 유용. 스토리보드를 쓰면 어차피 스토리보드에 있는 뷰를 가져와 쓸 테니 굳이 필요하지 않다.
    • 모두 직접적으로 코딩하여 만드는 경우를 제외하고는 override하지 않는 것이 좋다고 한다.

viewDidLoad()

  • view가 메모리에 로드되고 난 후에 호출
  • stack으로 로드된다
  • 뷰의 초기화 작업을 진행한다
    ex) 옵져버 등록

viewWillAppear()

  • view가 이제 나타날 거라는 신호를 controller에게 알리는 역할
  • 화면이 나타날때마다 수행하는 작업을 진행한다.
    ex) 뷰에 보여질 데이터 불러오기

viewDidAppear()

  • view가 나타났다는 것을 controller에게 알리는 역할, 에니메이션 적용
  • view 나타날 때 수행할 추가작업을 진행한다. 보통 다른 view에 있다가 돌아오는 경우 실행 되어야하는 작업들이다.
    ex:) 사용자 환영 애니메이션, 배경음악 재생

viewWillDisappear()

  • view가 삭제되려 한다는 것을 viewController에 알리는 역할
  • view가 사라지려고 하는 순간 진행되어야 하는 작업들
    ex) 배경음악 중지, 자동저장 작업

viewDidDisappear()

  • view가 제거되었음을 알리는 역할
  • view가 제거되고 나서 진행되어야하는 작업
    ex) 옵져버 구독 중단

출처: 야곰아카데미 활동학습

# View Life Cycle은 누가 관리를 할까 ?

  • view는 보여지게 하는 역할일뿐, viewController가 View Life Cycle 관리한다.

출처: 야곰아카데미 활동학습 3/3

# 왜 super.*** 를 호출해야할까 ?

  • 첫번째 이유): Apple문서에 써져있음, If you override this method, you must call super at some point in your implementation.
  • 두번째 이유): View Controller는 UIViewController를 상속하는 class인데, UIViewController가 기밀이라 추후 Apple은 언젠가 구현을 변경하여 발생 할 수 있는 충돌을 예방하기 위해서.
  • 야곰닷넷 이유): 뷰가로드되고 났을때, 우리는 알수없는 UIViewController에서 뷰를 만들때 하는 여러 설정들을 ‘마무리’해주는 작업이 필요하다고 해요.
    그래서 super.viewDidLoad()를 해줘서 어떤 기초적인 설정들을 ‘마무리’해주는 작업을 하고 그 이후에 우리는 우리가 하고싶은 어떤 작업들을 하죠.
    만약에 super.viewDidLoad()를 맨 밑에 적고, 그 사이에 어떤 작업들을 해주게되면 아직 viewDidLoad()의 설정이 끝나지않은 상태에서 어떤 작업들이 이루어지므로
    이상한 버그와 동작이 발생할 수 있는 것으로 알고있어요. 물론 그것을 제외하더라도 대충 찾아보면 습관적으로 꼭 호출하도록 하라고는 하더군요

[super을 붙여줘야하는 이유]

2️⃣ viewWillAppear와 viewDidAppear에서 무엇을 하면 좋을까요?

viewWillAppear

view가 화면에 보이기 직전에 호출되기 때문에 다음과 같은 작업을 수행하면 좋다.

  • 표시되는 view의 방향(가로모드, 세로모드)
  • 변경사항을 화면에 전달할 때(ex: 백그라운드 색상변경)
  • 뷰에 보여질 데이터를 불러온다. (데이터가 갱신이 되는 경우)

viewDidAppear

view가 view계층에 추가되고, 화면에 보이고 난 후 호출되기 때문에 다음과 같은 작업을 수행하면 좋다.

  • 이미지 또는 텍스트에 에니메이션 적용(사용자가 변경사항을 볼 수 있음)
  • 배경음악 재생

3️⃣ UIView의 layoutSubviews 메서드는 viewWillAppear보다 먼저 호출되나요? 그렇게 생각한 이유는 무엇인가요 ?

  • 아니요. viewWillAppear 이후에 호출됩니다.
  • 기본적으로 앱이 실행될때 위와같은 사이클을 지나고 난 후에 화면에 view가 그려지게됩니다.
  • view를 화면에 나타내려면 일단 view가 존재해야 합니다. 없는데 보여줬다고 할 수 없기때문이죠.
  • view는 크게 layout과 display두 가지를 통해서 위치와 크기를 잡고 화면에 view를 그리게 됩니다.
  • 그렇게 view가 그려지면 화면에 나타낼 수가 있습니다. 그 다음에 view가 다그려졌기때문에 viewDidAppear를 호출할 수 있는것이죠!
  • render loop가 크게 constraints -> layout -> Draw순으로 호출되는데 Layout에 layoutSubviews가 포함이 되어있습니다.
  • layoutSubviews는 view와 subview들의 위치 및 크기조정을 재배치하는 기능인데 화면을 나타내기 이전에 view를 그릴때하는 행동입니다.
  • 그렇기때문에 layoutSubview는 viewWillAppear가 호출된 후에 호출이 됩니다.

# 꼬리질문

# Constraints? Layout? AutoLayout?

Constraints(제약)을 통해 view의 layout(배치)을 잡는다.

Auto Layout(자동배치) -> constriant를 이용하여 view의 크기와 위치를 자동으로 조정하하게 하는 것

# layoutSubviews는 어떤 역할을 수행하나요?

view와 subview들의 위치 및 크기조정을 재배치하는 역할이다.

# layoutSubviews는 어떤상황에 호출되나요 ?

  • view의 크기를 조절할때
  • Subviews를 추가/ 삭제할때
  • 사용자가 "UIScrollView"를 스크롤할때
  • 기기를 회전할때
  • view의 autolayout constraint값을 변경할때
  • view의 bounds가 바뀔 때

https://medium.com/mj-studio/%EB%B2%88%EC%97%AD-ios-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83%EC%9D%98-%EB%AF%B8%EC%8A%A4%ED%84%B0%EB%A6%AC%EB%A5%BC-%ED%8C%8C%ED%97%A4%EC%B9%98%EB%8B%A4-2cfa99e942f9

https://stackoverflow.com/questions/728372/when-is-layoutsubviews-called