2012-04-12 6 views
0

私はまだself = super initを理解していません。私は多くの本やグーグルを読んでいましたが、 親クラスなどの戻りオブジェクトと同じ現在のオブジェクトをチェックするために使用されていることはわかっています。 しかし、それは答えではありません。誰かが私に簡単ではっきりと受け入れられる答えを与えることができますか? ありがとう!"self = super init"について誰でも簡単に説明できますか?

答えて

12

クイックアンサーは、クラスのスーパークラスにオブジェクトの初期化を指示していることです。そのスーパークラスから継承しているので、実装に固有の他の初期化タスクを実行できますが、まずは初期化の基本が実行されていることを確認する必要があります(これはベースクラスNSObjectによって処理されます)。別のクラスから継承する各クラスは、初期化を行う前にスーパークラスが初期化されていることを確認する必要があります。

あなたが作成することができる前に、あなたの親は創造されなければならず(スーパークラス)、最初に親が作られなければならなかった(スーパークラス)

オブジェクト指向プログラミングの基本を検索して、このようなことを学ぶことをお勧めします。

+4

2の回答のため、-1のビジュアルについて私の両親の:) – jmstone617

-1

NSObjectはルートクラスです。 https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html initメソッドがあります。そのinitメソッド内NSObjectクラスはObjective-Cのすべてのオブジェクトの初期化子です。 superは、単にオブジェクトのスーパークラスを返します。

Class Aから継承された場合、Class AClass Bのスーパークラスになります。再びClass CClass Bから継承され、Class CのスーパークラスはClass Bになります。そうです。あなたはクラスから[super init];を呼び出すと

、それは単にそのスーパークラス、その上のターンコールでinitそのスーパークラスのメソッドとのinitメソッドを呼び出します。最後に、ルートオブジェクトNSObjectに到達し、実際のinitメソッドを呼び出します。その時点で、iOSはあなたのオブジェクト用のメモリとあなたのオブジェクト用の必要なデータ構造を割り当てます。 NSObjectクラスの各メソッドとプロパティに関するドキュメントを参照してください。

UIViewのサブクラスであるクラスMyViewを作成した場合、クラス階層は次のようになります。あなたはクラスのMYVIEW "でinitメソッドを呼び出すとき

 NSObject 

UIAppearanceContainer 

    UIAppearance 

    NSCoding 

     UIView 

     MyView 

だから、それはUIViewの

initメソッド

UIViewのはNSCoding

のinitメソッドを呼び出します

NSCodingが初期化を呼び出します呼び出します。 UIAppearanceのメソッド

UIAppearanceはUIAppearanceContainerのinitメソッドを呼び出します

UIAppearanceContainerはNSObjectのinitメソッドを呼び出します。

+0

上記の例の2番目のステップでは、UIViewはNSCodingのinitメソッドを自動的に呼び出すか、別のself = super initをUIViewに記述する必要がありますか? – user1232250

+0

UIViewの中には、すべてのメソッドと同じようにself = [super init]という呼び出しがあります – rakeshNS

+0

私はこの答えが間違っていることを知りたいと思います。あなたのコメントを入力してください(この回答に誰が投票しましたか)。 – rakeshNS

0

あなたが「チェックする」というあなたの言及は、あなたが比較操作として=を見ていると思います。そうではありません。それは割り当てです。場合によっては、ifの条件内で割り当てが表示されることがあります。これは、代入式に値(割り当てられた値)があるという事実を利用しています。したがって、if (self = [super init])は、「-initメソッドを呼び出す」、「selfに結果を割り当てる」、およびを「スーパーの-initから非nilになっているかどうかをチェックする」(すなわち、スーパーが初期化に失敗しなかったこと)を組み合わせます。

この複合代入とテストが紛らわしいとエラーが発生しやすくなることがあるため、Appleは今、障害のチェックからの割り当てを分離お勧めします。

self = [super init]; 
if (self) 
    // ... continue initializing ... 
+0

はnil以外はゼロに等しいですか? – user1232250

+0

Cでは、ブール値テストでゼロ以外の値がtrueになると評価されます。 NULLポインタと 'nil'はゼロに変換され、したがってブールテストの場合はfalseになります。 –

関連する問題