4

メソッドでプロパティを使用することinitは悪い習慣と見なされていることを読みました。しかし、親クラスのプロパティを使用する必要がありますか?

例えば

-(id) init
{
    if (self = [super init])
    {
        self.parentProp = someVal; // (1)
        parentProp = someVal; // (2)
    }

    return self;
}

何が好まれますか(1または2)、そしてその理由は何ですか?ありがとう!

4

2 に答える 2

3

スーパーの init メソッドを呼び出して返されると、オブジェクトのスーパークラスの部分が初期化され、使用できるようになります。その後、そのプロパティアクセサーを使用することは正常であり、予想されます。例えば。のサブクラスを作成する場合、(継承された) title プロパティを設定するか、 init メソッドで をUIViewController変更するのが通常です。navigationItem

つまり、この動作を破ることができます。スーパークラスのメソッドの 1 つ (アクセサ メソッドの 1 つを含む) をオーバーライドし、そのメソッドを init メソッドで呼び出す場合、オブジェクトが完全に初期化される前に、オーバーライドされたメソッドが適切に動作することを確認する必要があります。

もっと微妙に言うと、スーパークラス メソッドをオーバーライドしてから、オーバーライドしていない別のスーパークラス メソッドを呼び出している可能性があります。では、呼び出したメソッドが反転して、オーバーライドしたメソッドを呼び出したらどうなるでしょうか。この可能性も認識しておく必要があります。

そうは言っても、init メソッドの 1 つを呼び出してスーパークラスを初期化した後で、スーパークラスのプロパティ アクセサーを使用してカスタマイズするのはまったく普通のことです。

于 2012-07-12T21:12:19.130 に答える
1

あなたの質問に答えるために-どちらも。

  1. (2)はプロパティアクセスではなく、インスタンス変数への直接アクセスです。それはクラス階層の設計に依存しますが、一般的に、非プライベート インターフェイスで ivar を使用することは強くお勧めしません。詳細については、関連する質問へのこの回答を参照してください。
  2. 一般に、クラス階層でサブクラス化を明示的に禁止していない場合は、クラス初期化子 (およびそのための dealloc) でクラス public メソッド (プロパティ アクセスを含む) を使用しないでください。そうする場合、これらのメソッド(またはプロパティアクセサー)をオーバーライドするサブクラスは、無効な状態(まだ初期化されていないか、すでに解放されている)にある間に呼び出されます。

私は一般的に pt.2 によって引き起こされる多くの問題に遭遇しましたが、それを無視する (つまり、初期化子で self/parent クラス プロパティを使用する) のが一般的な方法のようです。だから私はそれがあなた次第だと言うでしょう。クラス初期化子の外側で明示的なセットアップ用のコードをさらに記述して、この問題に遭遇することはないと確信してください。または、おそらくよりシンプル/短い初期化とクラスの簡単な使用を行いますが、その問題に注意してください。

于 2012-07-12T19:07:35.323 に答える