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

时间:2016-05-31 16:07:29

标签: ios objective-c uiview super

在我搜索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] ???

2 个答案:

答案 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:]