UIView.init()를 알아보자.

2023. 1. 2. 20:50iOS

1. UIView() = UIView.init() 은 없다.
2. 하지만 Xcode에서는 ()도 있는걸?

 

3. 사실, 여기서 init()은 NSObject의 init 이다. 아래와 같이, 상속관계를 가진다.

4. UIView ➡️ UIResponder ➡️ NSObject 

 

5. 그러나, init(frame:)  init(coder:) 두 개가 UIView의 Designated initializer ( = 필수 initializer) 이므로,

    UIView 를 생성하려면 이 둘 중 하나를 반드시 호출해야한다.

    ➡️ UIView() 로 뷰를 생성하면, 내부적으로 init(frame:CGRect) 을 호출해야만 하겠죠.

init(frame:)이 호출되며, frame값은 0,0,0,0을 가진다.

 

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