티스토리 뷰
init() vs viewDidLoad() in UIViewController
왜 갑자기 이런 의문이 들었을까?
UI 라이브러리인 Texture를 학습하며 init과 didLoad에 차이점을 학습한 경험이 있어요.
UIKit에서 UIViewController를 구성할 경우 init은 Main 스레드에서 동작하지만, Texture에서는 init과 didLoad의 차이가 있었어요.
어떤 코드의 경우 init에서 초기화를 하는지, didLoad에서 초기화를 하는지에 따라 큰 차이를 낼 수 있었어요.
예를 들면, UI 같은 경우 갱신을 Main 스레드에서 진행하기 때문에 굳이 init에서 선언하기보다 didLoad에서 선언하는 것이 좋았죠.
그래서 작업할 때 초기화 위치에 대한 고민을 많이 했던 것 같아요.
그런데 UIKit으로 작업하는 중 viewDidLoad와 init에서도 위와 같은 차이가 존재할지 궁금했어요.
UIViewController의 Life Cycle(생명 주기)
일반적으로 구현하는 ViewController는 UIViewController를 채택하고, 그래서 class로 선언을 해줘요.
class이기 때문에 init을 선언해줄 수 있겠죠?
이제 ViewController의 LifeCycle에 대해 알아볼게요.
UIViewController를 사용하기 위해서는 instantiate 되어야하므로 당연히 init이 시작일 거예요. 그리고 View를 부르는 loadView가 진행되고, 그 이후 View가 load 되었다는 뜻의 ViewDidLoad가 불려지겠죠.
이렇게 보면 당연히 다른 위치이므로 기능적으로 차이가 있을 것 같은데요, 그림에서 보는 것처럼 init 시점에는 아직 View가 load되지 않았기 때문에 View의 요소들에 접근하게 되면 에러가 발생해요.
예시로 볼게요!
Label의 text를 viewDidLoad에서 초기화할 경우, 화면이 실행되며 정상적으로 메세지가 출력되는 것을 확인할 수 있어요.
반면에 init에서 초기화할 경우
위와 같은 에러가 발생해요.
testLabel이 없는 상태인데 값을 할당하려다보니 문제가 생기는 것이죠!
하지만 위의 차이 말고는 ViewController 생성 시 한 번 불린다는 것은 같아요.
결론
ViewController를 초기화 하고 싶을 때, 초기화 대상이 View와 연관된 값이라면 반드시 viewDidLoad에서 처리해야 해요.
객체를 ByteStream으로 변환하는 작업처럼 특정한 작업이 아니라면 일반적인 경우는 viewDidLoad에서 초기화 작업을 하면 될 것 같아요 :]
'iOS 앱개발 > iOS' 카테고리의 다른 글
[iOS] Coordinator Pattern(feat. Swift)이란? (0) | 2022.01.29 |
---|---|
[iOS] RxTest를 통해 테스트하기 (0) | 2022.01.20 |
[iOS] 시뮬레이터 없이 UI 확인하는 Preview 기능 만들기 (0) | 2022.01.03 |
[iOS] 문자열에서 HTML 태그만 제거하기 (0) | 2022.01.03 |
[iOS] Kakao API 사용시 Date 타입이 iso8601일 때 iOS에서 Decoding이 안되는 경우 (0) | 2022.01.03 |
- Total
- Today
- Yesterday
- 배열합치기#분할정복#BOJ#Python
- 섬의개수#백준알고리즘#Python
- 공유기 설치#BOJ#이분탐색#Python
- 반복수열#백준알고리즘#Python
- django#slicing
- API#lazy#
- 토마토#백준알고리즘#Python
- django
- Swift#Tuples#Range
- Distinct#Codility#Python
- 파이썬알고리즘인터뷰#4장
- 암호코드#dp#BOJ#Python
- 병든 나이트#BOJ#탐욕법#Python
- 날짜 계산#BOJ#완전탐색#Python
- 텀 프로젝트#백준알고리즘#Python
- 종이자르기#분할정복#BOJ#Python
- NumberofDiscIntersections#Codility#Sort#Python
- Triangle#Sorting#Codility#Python
- filter#isalnum#lower
- 터틀비치#리콘#xbox#controller
- 나무자르기#BOJ#이분탐색#Python
- 쿼드트리#BOJ#분할정복#Python
- 랜선자르기#이분탐색#BOJ#Python
- 리모컨#완전탐색#BOJ#Python
- N으로 표현#DP#Programmers#Python
- Brackets#Stacks and Queues#Codility#Python
- 백준 알고리즘#BackTracking
- PassingCars#Codility#Python
- 미로 탐색#백준알고리즘#Python
- 순열사이클#BOJ#Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |