1

initオブジェクトを初期化すると ivar オブジェクトも初期化されるように、クラスのメソッドをオーバーライドしようとしています。

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

1) このコードは機能しますか? それでも、このソリューションは推奨されませんか?
2)if条件がないのはなぜ==ですか? 課題ですか?もしそうなら、なぜifですか?

これが明らかな場合は申し訳ありません!>_<

4

5 に答える 5

3

はい、それはうまくいくでしょう。

それが行うことは、呼び出し[super init]て、3 つのことのいずれかを実行できるようにすることです。

  • 自分自身を返します (つまり、同じオブジェクトselfが既に設定されています。
  • まったく新しいオブジェクトを返します。
  • nil失敗で戻る。

次に、結果が に代入されselfます。これにより、コンストラクターの残りの部分が、変更された場合に正しいオブジェクトで動作することが保証されます。ifnilが返された場合をキャッチするためにあります。その[super init]場合、残りのコンストラクターはスキップする必要があります。

于 2013-02-11T20:21:43.893 に答える
2

いくつかのタイプミス、アンバランスなブラケットがあり、ivar は ivar ではないと言っています ( 内で宣言するとif、そのスコープがそのブロックに対してローカルになります。または{}の後の s にインスタンス変数を配置する必要があります宣言)。しかし、はい、これは一般的にこれがどのように機能するかです。@implementation@interface

ただし、ivar が本当に必要かどうかはよく調べてください。コードで最後に使用したのはいつか思い出せません。私がそれらを使用していた状況の 99% は、@property今でははるかに優れたソリューションです。

追加の利点として、@propertys は独自のゲッターとセッターを合成するため、(通常)alloc定型文を手動で記述する必要がなくなるため、この問題は意味がありません。

于 2013-02-11T20:30:15.160 に答える
2

これ...

if(self = [super init])

動作しますが、コンパイラの警告が表示されます (この警告をオフにしていない場合)。

二重括弧を使用して警告を抑制することもできます。

if((self = [super init]))

私の現在の好み:

self = [super init];
if(self)
于 2013-02-11T20:25:58.590 に答える
2

1) ここでは、ローカル変数を宣言していますsomeIVarObject。クラスのインターフェイスまたは実装内でこれを中括弧で宣言し、それを として割り当てる必要がありますsomeIvarObject = ...。例:

@implementation MyClass {
    SomeClass *someIvarObject;
}

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

@end

2) 課題です。このイディオムの背後には長い歴史がありますが、ほとんどの場合、最初に呼び出された[super init]ものとは異なるオブジェクトを返す可能性を処理することに帰着します。init

于 2013-02-11T20:18:37.620 に答える
1

1) このコードは機能しますが、次の行:

SomeClass *someIVarObject = [SomeClass alloc] init];

少し意味があります。SomeClass *someIVarObject.h ファイルで宣言し、次のように init で初期化します。

someIVarObject = [SomeClass alloc] init];

2) この行if (self = [super init])は次と同等です。

self = [super init]; if (self != nil)

つまり、基本クラスの init メソッドが適切な値を返すことを保証します。

于 2013-02-11T20:20:58.227 に答える