0

斯威夫特

class A: UIView {

    override init() {
        super.init()
        println("init A")
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        println("initFrame A")
    }
}

B.斯威夫特

class B: A {

    override init() {
        super.init()
        //P1
        println("init B")
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        println("initFrame B")
    }
}

然后我称之为B()

我有一个输出:

initFrame A
initFrame B
init A
init B

我试图确定什么?什么时候?……之后B()。我希望完全理解它。

  1. init()A
  2. super.init()init()里面A
  3. init()B
  4. super.init()init()里面B
  5. init()UIView
  6. super.init()init()里面UIView

现在我们说对了P1,对吧?

  1. init()打电话给init(frame:)_BCGRectZero
  2. super.init(frame:)init(frame:)里面B
  3. init(frame:)A
  4. super.init(frame:)init(frame:)里面A
  5. init(frame:)UIView
  6. super.init(frame:)init(frame:)里面UIView

现在我们要回来了

  1. 叫剩下init(frame:)UIView
  2. init(frame:)A--> initFrame A中调用其余部分
  3. init(frame:)B--> initFrame B中调用其余部分

问题是现在发生了什么?我们现在在哪里?(在里面init()? )和UIView的行在哪里打印?init Ainit B

感谢帮助。

4

1 回答 1

1
  1. B()来电Binit()
  2. 这导致调用init()定义在B的超类A(由于super.init()inBinit()
  3. 反过来,这会导致调用init()defined inA的超类UIView(由于super.init()inAinit()
  4. UIView对当前实例的init()调用init(frame: CGRectZero)
  5. 由于当前实例是类的B,并且类B覆盖init(frame: CGRect)B所以调用自己的方法实现。
  6. 这导致调用A's init(frame: CGRectZero)(由于super.init(frame: frame)in B's init(frame: CGRect)
  7. 结果,UIView'sinit(frame: CGRectZero)被调用(由于super.init(frame: frame)inA自己的实现)
  8. 这结束了调用链
  9. 太好了,现在我们回到A's init(frame: CGRectZero)(列表中的第 6 点),它会打印initFrame A
  10. 回到B's init(frame: CGRectZero)(第 5 点),打印initFrame B
  11. 现在再次回到UIView's init()(第 3 点),它不打印任何内容
  12. 我们回到A's init()(第 2 点),打印initA
  13. B最后,我们在's (第 1 点)结束我们的旅程init(),它会打印initB,你用P1

请让我知道步骤是否清楚,是否需要添加更多细节以改进解释:我知道这有点令人费解。

于 2015-02-19T11:17:53.433 回答