1

他の方法で変数を設定するよりも良い習慣のように感じるという理由だけで、オブジェクトのカスタム初期化子を作成してきました。これらの初期化子では、通常、オブジェクトの変数を設定してから、メインのinitへの呼び出しを返します。

したがって、たとえば、UIViewControllerサブクラスでは、コードは次のようになります。

-(id)initWithValue:(int)val {
    self.value = val;
    return [self initWithNibName:nil bundle:nil];
}

ここvalueで、はそのViewControllerサブクラスに属する整数であり、通常はそれよりも多くの値があります。

ただし、最近self = [self init...]、クラスの現在のインスタンスが置き換えられ、そのインスタンスのselfが失われると考えたため、最初にselfを設定し始めました。だから、私は始めました:

-(id)initWithValue:(int)val {
    self = [self initWithNibName:nil bundle:nil];
    self.value = val;
    return self;
}

その後、最近元のバージョンを確認したところ、すべてが正しく機能し、変更が不要であることがわかりました。

だから、私の質問はこれです:

  1. [super initWithNibName:bundle:]は何をするので、オブジェクトは作成されますが、元のオブジェクトは置き換えられませんか?
  2. 2つのバージョンの一方が他方よりも使用に優れていますか、それとも両方とも同等ですか?どちらかが良い場合、どちらを使用する必要がありますか?

よろしくお願いします!

4

4 に答える 4

2

次の方法で行う必要があります。

- (id)initWithValue:(int)val {
    self = [super initWithNibName:nil bundle:nil];
    if (self) {
        _value = val;
    }
    return self;
}

iOS では、一般的なパターンは、init メソッドに送信されたパラメーターが無効な場合に nil を返すことです。値は、自己への現在のポインターまたは nil の 2 つのうちのいずれかになります。super の呼び出しが nil を返す場合、オブジェクトは適切に設定されていないため、nil も返す必要があります。doing self = [super initWithNibName:nil bundle:nil]; super によって返される可能性のある nil 値を尊重しやすくするだけです

于 2013-03-19T06:38:59.343 に答える
1

initメソッドをオーバーライドするには、次のコードを使用してください

 -(id)initWithValue:(int)val 
 {
   self = [super init];
   if(self)
     {
    self.value = val;
    }

   return self;
 }
于 2013-03-19T06:29:15.593 に答える
0

valueオブジェクトを作成する前にデータを保存しようとしているため、作成した最初のコードは を保存しません。しかし、2 番目のコードは、より良い実践のために小さな変更が必要でした。つまり、このように...

-(id)initWithValue:(int)val {
    self = [self initWithNibName:nil bundle:nil];

    if(self)
    _value = val;

    return self;
}

これがあなたに役立つことを願っています... :-)

于 2013-03-19T06:19:15.997 に答える
0

[super initWithNibName:bundle:] は実際にスーパークラスのメソッドを呼び出します。[self initWithNibName:bundle:] を使用すると、実際には initWithNibName:bundle: の書き換えが呼び出されます。もちろん、書き換えている必要があります。そうしないと、スーパークラス メソッドも呼び出されます。したがって、initWithNibName の書き換えで初期化を行いたい場合は、[self initWithNibName:bundle:] を使用できますが、追加の初期化を行う必要がない場合は、to メソッドとの間に違いはありません。

于 2013-03-19T06:30:23.730 に答える