UIView.init()를 알아보자.
2023. 1. 2. 20:50ㆍiOS
3. 사실, 여기서 init()은 NSObject의 init 이다. 아래와 같이, 상속관계를 가진다.
5. 그러나, init(frame:) 와 init(coder:) 두 개가 UIView의 Designated initializer ( = 필수 initializer) 이므로,
UIView 를 생성하려면 이 둘 중 하나를 반드시 호출해야한다.
➡️ UIView() 로 뷰를 생성하면, 내부적으로 init(frame:CGRect) 을 호출해야만 하겠죠.
6. init(frame:)을 직접 호출하는 것과, init()을 호출하는 데에 콜스택엔 아래와 같은 차이가 있다.
즉, AppKit / UIKit 쪽 코드인 [UIView init] 에서 NSObject의 init 을 override 한 후 init(frame:) 을 호출하고,
이후 @objc CustomView.init(frame:)를 호출한다.
7. 아래의 어셈블리 코드처럼, CGRectZero를 frame로 사용하여 initWithFrame에 objc_msgSend를 호출한다.
UIKit`-[UIView init]:
0x10b3ba160 <+0>: pushq %rbp
0x10b3ba161 <+1>: movq %rsp, %rbp
0x10b3ba164 <+4>: subq $0x20, %rsp
0x10b3ba168 <+8>: movq 0xc52f71(%rip), %rsi ; "initWithFrame:"
0x10b3ba16f <+15>: movq 0xcd5f72(%rip), %rax ; (void *)0x000000010f732690: CGRectZero
0x10b3ba176 <+22>: movq 0x18(%rax), %rcx
0x10b3ba17a <+26>: movq %rcx, 0x18(%rsp)
0x10b3ba17f <+31>: movq 0x10(%rax), %rcx
0x10b3ba183 <+35>: movq %rcx, 0x10(%rsp)
0x10b3ba188 <+40>: movq (%rax), %rcx
0x10b3ba18b <+43>: movq 0x8(%rax), %rax
0x10b3ba18f <+47>: movq %rax, 0x8(%rsp)
0x10b3ba194 <+52>: movq %rcx, (%rsp)
0x10b3ba198 <+56>: callq *0xcd7042(%rip) ; (void *)0x000000010c8b9800: objc_msgSend
0x10b3ba19e <+62>: addq $0x20, %rsp
0x10b3ba1a2 <+66>: popq %rbp
0x10b3ba1a3 <+67>: retq
'iOS' 카테고리의 다른 글
ㅜㄷㅌㅅ (0) | 2023.01.22 |
---|---|
https://velog.io/@eddy_song/stack-view (0) | 2023.01.07 |
Then (0) | 2023.01.06 |
required init?(coder: NSCoder), init 마지막 (0) | 2023.01.03 |
1월 1일, convenience init은 왜 무한루프일까? (0) | 2023.01.01 |