在以下示例中:
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()没有记录?或者我错过了这个文档?
我没有找到 的文档UIView.init,但UIView.init确实存在。如果在您的 处设置断点print ("...init with frame"),您将[UIView init]在Debug Navigator 中看到对 的调用。汇编代码清楚地示出它调用objc_msgSend到initWithFrame:使用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) 这样的构造函数。有关详细信息,您必须遵循苹果文档。
| 归档时间: |
|
| 查看次数: |
596 次 |
| 最近记录: |