2 番目の等号を取り除きます。適切なif
ステートメントは次のとおりです。
if(self = [super initWithFrame:frame])
これのポイントは、スーパー実装が、self の現在の値とは異なるが有効なオブジェクトを返す可能性があるということです。この場合、オブジェクトが異なるため、if ステートメントは false になり、初期化は行われません。ただし、別のオブジェクトが返されたため、スーパー実装は古い自己を解放しているはずです。これが返されます。これは、おそらく無効なポインターを返していることを意味します。
等号を 1 つだけ使用すると、変数を比較する代わりに変数を設定できます。ではないif(object)
場合は が真であるため、これは次と同等です。object
nil
if((self = [super initWithFrame:frame]) != nil)
または、理解しやすいバージョン:
self = [super initWithFrame:frame];
if(self != nil)
このコードself
は、返された値が同じであると仮定するのではなく、スーパーイニシャライザによって返された値になるように再割り当てします。init...
これは、変数をメソッドの結果ではなく、結果に設定することが重要である理由と同じalloc
です。
// good
id object = [[MyClass alloc] init];
// bad
id object = [MyClass alloc];
[object init];