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]???
没有。没有这样的事情是super
。 super
只是一种语法,允许您使用不同的方法查找机制调用 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__