iOS:UIView子类init会调用[super init]然后调用超类中的方法,为啥会调用[subclass initWithFrame:xx]?

Posted

技术标签:

【中文标题】iOS:UIView子类init会调用[super init]然后调用超类中的方法,为啥会调用[subclass initWithFrame:xx]?【英文标题】:iOS: UIView subclass init will call [super init] then call methods in super class, why it will call [subclass initWithFrame:xx]?iOS:UIView子类init会调用[super init]然后调用超类中的方法,为什么会调用[subclass initWithFrame:xx]? 【发布时间】:2016-05-31 16:07:28 【问题描述】:

我对 [UIView init] 和 [UIView initWithFrame:xx] 感到困惑,在我搜索 *** 后发现以下问题和答案:

Why do both init functions get called

ios: UIView subclass init or initWithFrame:? 然后我知道 initwithFrame 是设计的初始化程序,让我对答案感到困惑的是,当我们调用 [myview init](myView 是 UIView 的子类并覆盖 init 和 initwithfrme :) 时,它会调用 [super init] 然后它会call [super initWithFrame:xx] as super 会在 super 类中找到方法,为什么它会调用 [myView initWithFrame:xx]???

【问题讨论】:

【参考方案1】:

由于initWithFrame: 是指定的初始化器,Apple 的init 实现(当你调用[super init] 时调用它)内部调用initWithFrame: 函数并传入CGRectZero。这就是两者都被调用的原因。所以最终流程最终看起来像这样:

[YourClass init] -> [super init] -> [self initWithFrame:CGRectZero] -> 
[YourClass initWithFrame:CGRectZero] -> [super initWithFrame:CGRectZero]

假设您在 YourClass 中覆盖 init 时调用 [super init],而在覆盖 initWithFrame 时调用 [super initWithFrame:]

【讨论】:

感谢您的帮助。我可以看到。让我感到困惑的是我在列出的其他问题中发现,答案是 [YourClass init] -> [super init] -> [YourClass initWithFrame]->[super initWithFrame:CGRectZero],它会调用子类的 initWithFrame 然后调用超类的,这让我感到困惑?为什么要调用 [YourClass initWithFrime:XX]? 我更新了我的答案,实际上发生的是 [super init] 调用 [self initWithFrame] ...这是触发 [YourClass initwithFrame:] 然后依次调用 [super initWithFrame:] 是的,如果是,那么答案应该是。但是为什么“[super init]调用[self initWithFrame]”我们知道super是一个神奇的词告诉编译器在超类中查找方法,那么“[super init]调用[super initWithFrame]”应该吗??? 苹果就是这样实现的。 [UIView init] 的基本实现调用 [UIView initWithFrame:CGRectZero]。我们不清楚苹果为什么做出这个决定,但它可能会简化他们的代码并为 UIView 提供一个方便的初始化程序。这是预期的行为。 好的,我终于明白了。非常感谢。 [super init] 之后的序列是 [self initWithFrame:xx];【参考方案2】:

它会调用 call [super init] 然后它会调用 [super initWithFrame:xx] as super 会在超类中找到方法,为什么 会调用 [myView initWithFrame:xx]???

没有。没有这样的事情是supersuper 只是一种语法,允许您使用不同的方法查找机制调用 self 上的方法。在这里,[super init] 调用将查找在您的对象上调用的方法 -[UIView init]self 指向的那个)。在-[UIView init] 内部,它有一个调用[self initWithFrame:],它再次在您的对象上调用(self 指向的那个)。这里没有使用super,所以使用了普通的方法查找机制(UIView的超类反正没有-initWithFrame:)。正常的方法查找机制在对象的类中查找最被覆盖的实现。由于你的类(你的对象的类)覆盖了-initWithFrame:,它查找的方法是-[YourClass initWithFrame:]

【讨论】:

谢谢。而且我认为我在问题之前误解了关键字 super 。现在我知道你和 john_ryan 的帮助-->super 只是一种语法,允许你调用自己的方法,使用不同的方法查找机制。

以上是关于iOS:UIView子类init会调用[super init]然后调用超类中的方法,为啥会调用[subclass initWithFrame:xx]?的主要内容,如果未能解决你的问题,请参考以下文章

子类UIButton:属性未在super.init调用时初始化

Python3基础 super 子类调用父类的__init__

Python3基础 super 子类调用父类的__init__

用 super() 装饰子类的 __init__ 方法

super()方法的使用

@IBDesignable UIView 不在情节提要中调用 init