24


私はself = [super init]initメソッドで見ました。理由がわかりません。[super init]スーパークラスを返さないのですか? そして、 を指すself = [super init]と、得られないのself = superclassでしょうか?
コードフラグメントの例を次に示します

- (id)init 
{
    if (self = [super init]) {
        creationDate = [[NSDate alloc] init];
    }
    return self;
}

誰かが私のためにこれを明確にしてくれることを願っています。ありがとうございました。

4

8 に答える 8

45

MyClassが のサブクラスであると仮定するとBaseClass、 を呼び出すと次のことが起こります。

MyClass *mc = [[MyClass alloc] init];
  1. [MyClass alloc]のインスタンスを割り当てますMyClass
  2. init初期化プロセスを完了するために、メッセージがこのインスタンスに送信されます。
    そのメソッドself(すべての Objective-C メソッドの隠し引数) は、ステップ 1 で割り当てられたインスタンスです。
  3. [super init]同じ (隠し) 引数で のスーパークラス実装を呼び出します。(これはあなたが間違って理解した点かもしれません。)initself
  4. initメソッドではBaseClassselfは の同じインスタンスのままですMyClass。このスーパークラスの init メソッドは、次のいずれかを実行できるようになりました

    • の基本初期化を実行selfして を返すself、または
    • 別のオブジェクトを破棄selfして割り当て/初期化して返します。
  5. :のinitメソッドに戻ると、次のいずれかになりますMyClassself = [super init]

    • MyClassステップ 1 で割り当てられたオブジェクト、または
    • 何か違います。(そのため、この戻り値を確認して使用する必要があります。)
  6. 初期化が完了します (selfスーパークラス init によって返された を使用)。

ですから、あなたの質問を正しく理解していれば、主なポイントは

[super init]

は、オブジェクトではなくオブジェクトである引数をinit使用してのスーパークラス実装を呼び出します。selfMyClassBaseClass

于 2013-09-09T07:50:27.450 に答える
6

if条件に質問self = [super init]があるので、特定の意味を示唆しています。

まず、[super init]現在使用されている既存のクラスのスーパークラスの初期化を行います。を使用[super init]すると、クラスのオブジェクトが存在することを示すスーパークラスの初期化が行われます。

これを使用するself = [super init]と、同じクラスをさらに利用するためにクラスを自己に割り当てることになります。

そして最後に if 条件に入れif(self = [super init])ます。これは、アプリケーションの不正な動作を防ぐために、クラスのオブジェクトが存在するかどうかをチェックしていることを意味します。

これでクリアだと思います!!!

于 2013-09-09T07:51:15.547 に答える
2

宣言するすべてのメソッドには、self と _cmd という 2 つの隠しパラメーターがあります。

次の方法:

- (id)initWithString:(NSString *)aString;

コンパイラによって次の関数呼び出しに変換されます。

id initWithString(id self, SEL _cmd, NSString *aString);

詳細については、このリンクを参照してください。

http://www.cocoawithlove.com/2009/04/what-does-it-mean-when-you-assign-super.html

于 2015-06-14T16:57:15.960 に答える
1

すべてのスーパー変数などを初期化すると、返される前に拡張クラス変数を初期化できると思います。

于 2013-09-09T07:32:18.553 に答える
1

[super init][ self superclass_variant_of_init]と同じです

スーパークラスにメッセージを送信する場合は、別の方法があります (ランタイム ライブラリを使用しない):

[[self superclass] init];
于 2013-09-09T09:24:54.577 に答える