UIView.init() 在哪里记录?

Dec*_*lan 6 ios swift

在以下示例中:

import UIKit

class MyView: UIView
{
    override init(frame: CGRect) {
       super.init(frame: frame)
       print ("...init with frame")
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        print("...init with coder")
    }
}
Run Code Online (Sandbox Code Playgroud)

......

 let var = MyView() //  "...init with frame" gets printed
Run Code Online (Sandbox Code Playgroud)

所以似乎MyView()调用UIView.init()又调用init(frame: CGRect). 但是,根据UIView 文档,只有一个 init(frame:) (和 (init:coder))。

根据 NSObject的文档。在里面()

不初始化;它只是返回自我。

所以必须有一个UIView.init()覆盖NSObject.init()并依次调用init(frame:). 但这UIView.init()没有记录?或者我错过了这个文档?

vac*_*ama 5

我没有找到 的文档UIView.init,但UIView.init确实存在。如果在您的 处设置断点print ("...init with frame"),您将[UIView init]Debug Navigator 中看到对 的调用。汇编代码清楚地示出它调用objc_msgSendinitWithFrame:使用CGRectZero作为帧:

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   
Run Code Online (Sandbox Code Playgroud)


小智 0

如果你在 swift 中调用 MyView() 。这意味着它调用默认构造函数,即调用 init 。如果你想像 Objective c 中那样调用 initWithFrame ,那么你必须调用像 MyView(frame:CGRect) 这样的构造函数。有关详细信息,您必须遵循苹果文档。