2016-05-31 14 views
1

私は[UIViewのINIT]および[UIViewのinitWithFrame:XX]で混乱しています、私はstackoverflowのを検索し、私は質問と回答の下に見つけた後:iOS:UIViewサブクラスのinitは[super init]を呼び出し、スーパークラスのメソッドを呼び出します。なぜ[subclass initWithFrame:xx]を呼び出すのですか?

Why do both init functions get called

iOS: UIView subclass init or initWithFrame:? 、私はinitwithFrameが設計されてkonw私が[myview init](myViewはUIViewのサブクラスであり、initとinitwithfrmeを上書きしています:)を呼び出したときに、[super init]を呼び出すと[super initWithFrame:xx]を呼び出しますsuperは、スーパークラスのメソッドを検索します。なぜ[myView initWithFrame:xx]を呼び出すのですか? initWithFrame:以来

答えて

3

は指定イニシャライザ、(あなたが[super init]を呼び出すときに呼び出す)initのAppleの実装内部ではinitWithFrame:関数を呼び出し、CGRectZeroに渡しています。それが両方とも呼ばれる理由です。だから、最後の流れはこのように見える終わる:

[YourClass init] -> [super init] -> [self initWithFrame:CGRectZero] -> 
[YourClass initWithFrame:CGRectZero] -> [super initWithFrame:CGRectZero] 

これは、あなたがinitWithFrameをオーバーライドするときにYOURCLASSでINITをオーバーライドし[super initWithFrame:]ときに[super init]を呼び出すと仮定しています。

+0

ありがとうございました。私はそれを見ることができます。あなたが私のリストとして他の質問で見つけられたのは混乱させます。答えは[YourClass init] - > [super init] - > [YourClass initWithFrame] - > [super initWithFrame:CGRectZero]サブクラスのinitWithFrameを呼び出してスーパークラスを呼び出すと、混乱しますか?なぜ[YourClass initWithFrime:XX]に電話をするのですか? – Luca

+0

答えを更新しました。本当に[super init]が[self initWithFrame]を呼び出しています...これは[YourClass initwithFrame:]をトリガーし、次に[super initWithFrame:]を呼び出します。 –

+0

答えはすべきです。しかし、なぜ[super init]が[self initWithFrame]を呼び出すのか "ということは、スーパークラスでメソッドを見つけるためにコンパイラにマジックワードを知らせるので、" [super init]は[super initWithFrame]を呼び出すべきですか "??? – Luca

0

それが呼び出す呼び出します[スーパーのinit]それが呼び出す[スーパー initWithFrame:xx]は、スーパークラスのメソッドを見つけるだろう、スーパー、など、なぜそれ [MYVIEW initWithFrame:XX]を呼び出します???

いいえ、このようなものはありませんsuperです。 superは、selfのメソッドを呼び出すための構文に過ぎず、別のメソッドルックアップメカニズムを使用します。ここでは、[super init]コールは、オブジェクトに呼び出された-[UIView init]メソッドを検索します(selfが指すもの)。 -[UIView init]の内部には、[self initWithFrame:]という呼び出しがあります。これはオブジェクトに対して呼び出されます(selfが指し示すもの)。ここではsuperを使用しないので、通常のメソッド検索メカニズムが使用されます(UIViewのスーパークラスは、とにかく-initWithFrame:を持っていません)。通常のメソッドルックアップメカニズムは、オブジェクトのクラスで最もオーバーライドされた実装を見つけます。あなたのクラス(あなたのオブジェクトのクラス)が-initWithFrame:をオーバーライドするので、それが調べるメソッドは-[YourClass initWithFrame:]です。

+0

ありがとうございます。そして私は質問の前にキーワードsuperを誤解していると思う。今あなたとjohn_ryanの助けを借りて知っています - >スーパーは、別のメソッドルックアップメカニズムを使って自分自身でメソッドを呼び出すことができる構文です。 – Luca

関連する問題