0

私はまだ self=super init; を理解していません。とはいえ、私はたくさんの本やグーグルを読みました。現在のオブジェクトが親クラスからの戻りオブジェクトと等しいことを確認するために使用されることは知っていますが、それが答えであることは受け入れられません。誰かが私に簡単だが堅実な受け入れられる答えを教えてくれますか? ありがとう!

4

3 に答える 3

12

簡単な答えは、クラスのスーパークラスにオブジェクトを初期化するように指示しているということです。そのスーパークラスから継承しているため、実装に固有の他の初期化タスクを実行できますが、最初に初期化の基本が実行されていることを確認する必要があります(これは基本クラスNSObjectによって処理されます)。別のクラスから拡張(継承)する各クラスは、初期化を実行する前に、スーパークラスが初期化されていることを確認する必要があります。

非常に迅速に作成された(したがって、おそらく非常に貧弱な)アナログ-作成する前に、親を作成する必要があり(スーパークラス)、最初に親を作成する必要がありました(スーパークラス)。

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

于 2012-04-12T13:13:10.223 に答える
0

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

この割り当てとテストの組み合わせは混乱を招き、エラーが発生しやすいため、Apple は現在、失敗のチェックから割り当てを分離することを推奨しています。

self = [super init];
if (self)
    // ... continue initializing ...
于 2012-04-14T15:40:49.390 に答える
-1

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 AClass 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 メソッドを呼び出します。

于 2012-04-12T13:30:40.803 に答える