为什么调用 init() 会调用 init(frame: CGRect)?

Why does calling init() calls init(frame: CGRect)?

当我有一个自定义的 UIView 并像这样覆盖初始化时:

class ContainerView: UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func setup() {
    }
}

为什么我可以像这样使用简单的 init 来初始化视图并调用 setup() 方法?

let view = CustomView()

当我调用简单的 NSObject init() 而不是 init(frame: CGRect)?

时,我希望它不会被调用

frame参数是怎么传的?

调用 CustomView() 正在使用 NSObject 的继承初始值设定项。这隐含地调用 UIView 的指定初始化程序,init(frame:).zero。由于您已经重写了该初始化程序,因此会调用您的重写,因此也会调用 setup() 方法。

您可以通过在初始化程序中打印出 frame 参数来看到这一点;你会得到一个 .zero 矩形。