UIViewController: ViewController Life Cycle (feat. 스토리보드 vs 코드)

J.Noma·2021년 11월 7일
0

iOS : View : UIKit

목록 보기
10/17
post-custom-banner

ViewController에 대한 기본적인 내용은 여기를 참고해주세요

이번 포스팅에선 뷰컨의 Life Cycle을 간략히 소개하되
뷰컨을 스토리보드로 만들 때와 코드로 만들 때의 '차이점'에 좀 더 집중하여 정리해보겠습니다


🐸 뷰컨's Life Cycle

✔️ init() : 공식문서

뷰컨의 생성자 메서드입니다.

뷰컨의 init()은 두 개가 있으며, 스토리보드냐 xib/코드냐에 따라 다른 것이 호출됩니다

1. init(nibName: String?, bundle: Bundle?)

특정 nib file을 소스로 뷰컨을 만들거나 소스가 없이 만드는 경우 호출됩니다

정리하면
🔘 첫 번째로, xib로 뷰컨을 만들어 nib file을 소스로 사용하는 경우
🔘 두 번째로, 코드로 뷰컨을 만드는데 소스없이 만드는 경우
(예로, 단순히 ViewController()라고 호출해서 생성하는 경우)

nibName '파라미터'에 값을 넣어주면 그것을 소스로 사용하고, 안 넣어주면 nibName '프로퍼티'에 적힌 nib 파일을 소스로 사용합니다
(하지만 nibName 프로퍼티마저 nil일 수 있다는 점..)

2. init?(coder: NSCoder)

일반적으로 스토리보드처럼 unarchived data로 뷰컨을 만들면 호출됩니다

정리하면
🔘 첫 번째로, segue가 trigger되는 경우
🔘 두 번째로, 코드로 instantiateViewController(withIdentifier:)를 호출하는 경우
(identifier는 스토리보드 뷰컨의 것)


✔️ awakeFromNib() : 공식문서

nib file을 소스로 생성되는 객체는 초기화가 완료되면 이 메서드를 호출하게 됩니다
즉, 이 메서드가 호출되는 시점에는 모든 outlet/action이 연결 완료된 상태입니다

❗️주의❗️
일반 UIView는 위에서 설명한 것처럼 awakeFromNib() 메서드가 호출된 시점에는 자신이 가진 IBOutlet들이 연결되어 접근이 가능한 상태입니다
하지만, 왜인지 UIViewController는 그렇지 않습니다. 뷰컨의 @IBOutlet가 연결되는 시점은 loadView() 입니다

비록 이 메서드의 default 구현에는 아무 내용도 없긴 하지만 UIKit class들이 이 메서드에 추가적인 초기화 작업을 넣어놨으므로 life cycle 메서드들처럼 super를 반드시 호출해야 합니다


✔️ prepare(for:sender:) : 공식문서

해당 뷰컨에서 다른 뷰컨으로 segue가 실행될 때 호출됩니다

즉, 뷰컨A -> 뷰컨B 전환 segue가 발생할 때
뷰컨A의 prepare 메서드가 호출됩니다


✔️ loadView() : 공식문서

view 프로퍼티와 IBOutlet을 채워줍니다

🔘 loadView 동작 Flow

  1. view 프로퍼티가 비어있는지 확인합니다

  2. (비었다면) nibName 프로퍼티에 소스 nib 파일이 적혀있는지 확인합니다

  3. (적혀있다면) 뷰 내용을 데려와서 view 프로퍼티를 채워줍니다

🔘 nibName에 뭔가가 적혀있는 경우

  • 뷰컨 인스턴스가 StoryBoard에 의해 만들어지는 경우 init(coder:NScoder)를 호출하면서 적어줌
  • xib(nib)파일을 사용하면 init(nibName:bundle:) 메서드를 호출하면서 적어줌
  • iOS가 App번들에서 해당 뷰컨의 class name에 기반한 nib 파일을 찾은 경우 적어줌

이 3가지 경우에 해당하지 않아 nibName이 없다면 그냥 빈 UIView를 만들어 채웁니다

❗️주의❗️
Interface Builder를 사용하는 경우, 이 loadView()를 override하면 안됩니다
(코드로 view를 만드는 경우에는 가능)


✔️ viewDidLoad()

view 프로퍼티가 채워지면, 즉, 메인 뷰가 메모리 로드 완료되면 호출됩니다
주의할 점은, 아직 화면에 보여주진 않고 있다는거~


✔️ viewWillAppear()

뷰컨이 App의 Window에 보여질 때 호출됩니다

뷰컨이 처음 생성되고 보여질 때도 호출되겠지만,
네비게이션에 의해 window 뒤로 잠시 빠졌다가 다시 보여질 때도 호출됩니다

❗️주의❗️
아직 유저가 화면을 볼 수 없는 상태입니다

❗️주의❗️
modal은 아래 그림과 같이 window에서 이전 화면을 빼지 않으므로 modal 전환했다가 돌아오는건 appear를 유발하지 않습니다

반면, Navigation 전환은 이전 화면이 window에서 빠지므로 되돌아오면 appear를 유발합니다


✔️ viewDidAppear()

이제부터 유저가 화면을 볼 수 있습니다


✔️ viewWillDisappear()

해당 뷰컨이 window에서 빠질 때 호출됩니다
보통 해당 화면이 아예 dismiss되거나, 네비게이션에 의해 window에 빠질 때 호출됩니다


✔️ viewDidDisappear()

disappear 끝

❗️주의❗️
modal의 경우 제스쳐로 dismiss가 가능하다보니, 내릴랑말랑 까딱까딱하면 viewWillAppear만 호출되고 완전히 내려버릴 때서야 viewDidAppear가 호출된다


viewDidUnload()

메모리 해제될 때 호출된다는데.. Deprecated 되었다고 한다..


✔️ deinit()

정말 메모리 해제되는 순간 호출된다

profile
노션으로 이사갑니다 https://tungsten-run-778.notion.site/Study-Archive-98e51c3793684d428070695d5722d1fe
post-custom-banner

0개의 댓글