在我搜索stackoverflow之后,我对[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 :)时,它会调用call [super init]然后它会调用[super initWithFrame:xx] as super会在超类中找到方法,为什么会调用[myView initWithFrame:xx] ???
答案 0 :(得分:3)
由于initWithFrame:
是指定的初始值设定项,因此apple init
的实现(在调用[super init]
时调用)会在内部调用initWithFrame:
函数并传入{{1} }}。这就是被调用的原因。所以结束流程看起来像这样:
CGRectZero
这假设您在覆盖YourClass时调用[YourClass init] -> [super init] -> [self initWithFrame:CGRectZero] ->
[YourClass initWithFrame:CGRectZero] -> [super initWithFrame:CGRectZero]
,而在覆盖[super init]
时调用[super initWithFrame:]
。
答案 1 :(得分:0)
它将调用[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:]
。