0

A.スイフト

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. --> initFrame Aの残りの部分をinit(frame:)呼び出しますA
  3. --> initFrame Bの残りの部分をinit(frame:)呼び出しますB

問題は、今何が起こっているかです。私たちは今どこにいますか?(? の内部)init()と?UIViewの行はどこに出力されinit Aますinit Bか?

手伝ってくれてありがとう。

4

1 に答える 1

1
  1. B()Bの呼び出しinit()
  2. init()これにより、 defined inBのスーパークラスが呼び出されますA( super.init()in にBよるinit()) 。
  3. init()これにより、 defined inAのスーパークラスが呼び出されますUIView( super.init()in にAよるinit()) 。
  4. UIViewの現在のインスタンスでのinit()呼び出しinit(frame: CGRectZero)
  5. 現在のインスタンスはクラスBであり、クラスはBオーバーライドするためinit(frame: CGRect)Bメソッドの独自の実装が呼び出されます
  6. これにより、 が呼び出されますA( init(frame: CGRectZero)insuper.init(frame: frame)Bためinit(frame: CGRect)) 。
  7. 結果として、UIViewinit(frame: CGRectZero)呼び出されます ( super.init(frame: frame)inA独自の実装のため)。
  8. これで一連の呼び出しが終了します
  9. では、 に戻ります(リストAinit(frame: CGRectZero)ポイント 6)。initFrame A
  10. Binit(frame: CGRectZero)(ポイント 5) に戻ります。initFrame B
  11. 再び (ポイント 3) に戻りますUIViewinit()、何も出力されません。
  12. Ainit()(ポイント 2) に戻ります。initA
  13. 最後に、あなたが印を付けたを出力Bするinit()(ポイント 1) で旅行を終了します。initBP1

手順が明確かどうか、説明を改善するために詳細を追加する必要があるかどうかをお知らせください。少し複雑であることは承知しています。

于 2015-02-19T11:17:53.433 に答える