私はまだ self=super init; を理解していません。とはいえ、私はたくさんの本やグーグルを読みました。現在のオブジェクトが親クラスからの戻りオブジェクトと等しいことを確認するために使用されることは知っていますが、それが答えであることは受け入れられません。誰かが私に簡単だが堅実な受け入れられる答えを教えてくれますか? ありがとう!
3 に答える
簡単な答えは、クラスのスーパークラスにオブジェクトを初期化するように指示しているということです。そのスーパークラスから継承しているため、実装に固有の他の初期化タスクを実行できますが、最初に初期化の基本が実行されていることを確認する必要があります(これは基本クラスNSObjectによって処理されます)。別のクラスから拡張(継承)する各クラスは、初期化を実行する前に、スーパークラスが初期化されていることを確認する必要があります。
非常に迅速に作成された(したがって、おそらく非常に貧弱な)アナログ-作成する前に、親を作成する必要があり(スーパークラス)、最初に親を作成する必要がありました(スーパークラス)。
この種のことを学ぶために、オブジェクト指向プログラミングの基本を検索することをお勧めします。
「チェック」というあなたの言及は、あなたが=
比較操作として見ていると私に思わせます。そうではありません。課題です。割り当てがif
条件内に表示されることがあります。これは、割り当て式に値 (割り当てられた値) があるという事実を利用しています。したがって、if (self = [super init])
「スーパーのメソッドを呼び出す-init
」、「結果を代入するself
」、および「スーパーから非 nil を取得したかどうかを確認する-init
」(つまり、そのスーパーが初期化に失敗しなかったかどうかを確認する) を組み合わせます。
この割り当てとテストの組み合わせは混乱を招き、エラーが発生しやすいため、Apple は現在、失敗のチェックから割り当てを分離することを推奨しています。
self = [super init];
if (self)
// ... continue initializing ...
NSObject はルートクラスです。
https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.htmlinit
そこにメソッドがあります
。クラス内のそのinit
メソッドNSObject
は、Objective-C のすべてのオブジェクトの初期化子です。super
オブジェクトのスーパークラスを返すだけです。
Class B
から継承された場合Class A
、Class A
のスーパー クラスになりClass B
ます。Class C
から継承された別のクラスClass B
、 のスーパークラスはClass C
になりますClass B
。後で。
クラスから呼び出すときは[super init];
、単にinit
そのスーパー クラスのメソッドを呼び出し、そのスーパー クラスのメソッドを呼び出しますinit
。最後に、ルート オブジェクト NSObject に到達し、実際のinit
メソッドを呼び出します。その時点で、iOS はオブジェクトにメモリを割り当て、オブジェクトに必要なデータ構造を割り当てます。NSObject クラスの各メソッドとプロパティに関するドキュメントを参照してください。
MyView
のサブクラスであるクラスを作成した場合UIView
、クラス階層は になります。
NSObject
UIAppearanceContainer
UIAppearance
NSCoding
UIView
MyView
したがってinit
、クラス「MyView」でメソッドを呼び出すと、呼び出されます
UIViewのinitメソッド
UIView は NSCoding の init メソッドを呼び出します
NSCoding は UIAppearance の init メソッドを呼び出します
UIAppearance は UIAppearanceContainer の init メソッドを呼び出します
UIAppearanceContainer は NSObject の init メソッドを呼び出します。