2

そのような初期化を行う指定された初期化子があるとします。

- (id)initWithBlah:(NSString *)arg1 otherBlah:(NSArray *)arg2
{ 
    if (self = [super init])
    {
        ...
    }
    return self;
}

これを呼び出す必要がある別の初期化子がありますが、その後、他のセットアップタスクを実行します。

- (id)initWithSomeOtherBlah:(void *)creativeArg
{
    // Is this right? It seems to compile and run as expected, but feels wrong
    self = [self initWithBlah:nil otherBlah:nil];
    if (self)
    {
        [self someProcessingForThisInitDependentOnSelfInit:creativeArg];
    }

    return self;
}

戻り値が正しいことを確認するためのテストなので、このコンテキストでは 'self' を使用する必要がありますか? これがイベントの有効な組み合わせでさえあるのかどうか疑問に思っています。指定されたイニシャライザが実行された後に、追加のセットアップを実行する必要があるイニシャライザがある状況があります。

この追加処理を指定された初期化子に押し込むことが正しいアプローチかどうか疑問に思っています..

さらに説明が必要な場合はお知らせください。私はこれをシンプルにしようとしていました。:)

ありがとう!

4

3 に答える 3

5

私が従う一般的な経験則では、指定された初期化子はほとんどのパラメーターを持つ初期化子であり、他の初期化子は指定された初期化子にチェーンダウンします。

この例では、initWithSomeOtherBlahコンストラクターでcreativeArgを使用していません。それが意図的なものかどうかはわかりません。

このアプローチでは、副作用プログラミングの代わりにオブジェクトを作成するときに、意図を明確に示しています。

例えば:

@implementation BlaClass

- (id)initWithBlah:(NSString *)arg1 otherBlah:(NSArray *)arg2 creativeArg:(void *)arg3
{
    if (self = [super init])
    {
        self.arg1 = arg1;
        self.arg2 = arg2;
        self.arg3 = arg3;
        [self someProcessingForThisInitDependentOnSelfInit:arg3];
    }
    return self;
}


- (void)someProcessingForThisInitDependentOnSelfInit:(void *)creativeArg
{
    if(creativeArg == NULL) return; 


    //do creative stuff 
}

- (id)initWithSomeOtherBlah:(void *)arg
{
    return [self initWithBlah:nil otherBlah:nil creativeArg:arg];
}

 ...
 @end
于 2012-06-16T04:50:27.147 に答える
0

指定されていないイニシャライザから別のイニシャライザを呼び出しても問題はありません。Apple のドキュメントはこちらを参照してください。

2 つ以上の指定されたイニシャライザ ( と を含むビューinitWithFrame:などinitWithCoder:) がある場合、両方のイニシャライザから呼び出すメソッドを定義することに気付きましたsetUp。これは、メソッドの短い名前ですsomeProcessingForThisInitDependentOnSelfInit

于 2012-06-16T08:05:55.763 に答える
0

クラスを多少異なる方法で初期化する 2 つの初期化子がクラスに必要な場合、適切なコーディング プラクティスは、両方の初期化子が実行する必要があるセットアップ タスクを特定し、それらを別のメソッドに移動することです。このように、あるカスタム初期化子を別の内部で呼び出す必要はありません。これを行う方法は次のとおりです。

-(void) setupBlah
{.....}

- (id)initWithBlah:(NSString *)arg1 otherBlah:(NSArray *)arg2
{ 
    if (self =[super init])
      {
        [self setupBlah];
        //Do other initialization
            ....
       }
   return self;
}

- (id)initWithSomeOtherBlah:(void *)creativeArg
{


    if (self = [super init])
    {
        [self setupBlah];
        //Do other initialization
          .....
    }

    return self;
}
于 2012-06-16T05:15:47.793 に答える