1

以下のオーバーロードされたイニシャライザでは、[self initWith..] を呼び出しても問題ありませんか? [super init] がまだ行われていないときに「self」で何かを呼び出しているのでしょうか。

私がこれをテストしたとき、これはすべてうまくいきます。[super init] 呼び出しの前でも、「self」でメソッドを呼び出すことができるということですか? 誰でもこれを理解するのを手伝ってもらえますか?

-(id)initWithObjectA:(id)objectA{
    if (self = [super init]) {
        //Do other initializations
        //Use ObjectA
    }
    return self;
}

-(id)initWithObjectA:(id)objectA andWithObjectB:(id)objectB{

    if (self = [self initWithObjectA:objectA]) {
        //Use ObjectB
    }
    return self;
}

//More overloading initializers

ありがとう。

4

3 に答える 3

2

Apple のドキュメントによると、指定されたクラスの指定されたイニシャライザは、すべての実際の初期化を実行する必要があります。他のイニシャライザは、指定されたイニシャライザを直接的または間接的に呼び出す必要があります。したがって、あるイニシャライザが別のイニシャライザを呼び出す必要があると考えるのは正しいですが、提供した例ではそれを逆に行っています。メソッドを次のように書き直すことを検討してください。

- (id)initWithObjectA:(id)objectA
{
    return [self initWithObjectA:objectA objectB:nil];
}

- (id)initWithObjectA:(id)objectA objectB:(id)objectB
{
    if (self = [super init])
    {
        // Perform custom initialization...
    }

    return self;
}

編集

オブジェクトが完全に初期化される前にメッセージを送信することに関してselfは、もちろん問題ありません。考えてみればself、オブジェクトがメッセージを受信したときに初期化されるポインターです。(self実際には隠し引数としてメソッドに渡されますが、それは別の話です。) 問題のオブジェクトが既にメッセージを受信して​​いることを考えると、それ自体に追加のメッセージを送信できない理由はありません。

于 2013-02-10T05:51:00.667 に答える
1

はい、うまくいきます。私はしばしばこれを行って、プライベート変数をデフォルト値で初期化します。これにより、記述するコードが少なくなり、コンストラクターの階層が表示されます。

selfhere は、あなたが書いたのと同じように機能しますsuper。したがって、他のコンストラクターを呼び出すだけです。

于 2013-02-10T05:30:54.153 に答える
0

はい、これを行うことができます。これは、他のメソッドから呼び出す単純なメソッドのようなものです。ここでは何も悪いことはありません。オブジェクトの数に応じて、特定の初期化子を呼び出すことができます。

それはただ大丈夫ではありません、それは常に最善の方法です

于 2013-02-10T05:35:03.267 に答える