2012-04-23 6 views
2

のObjective-Cでは、なぜ我々はObjective-Cでは、オブジェクトのインスタンス変数またはプロパティにデフォルト値が設定されていないのはなぜですか?

@interface Animal : NSObject { 
    int state = AnimalStateAlive; // a constant which is 1 to indicate alive 
    int x = 0; 
    int y = 0; 
} 

@properties int energyLevel = 100; 

を使用することはできませんし、コンパイラはallocが起こった直後に、これらの値を入力することができますか?

答えて

3

オブジェクトCにはコンストラクタというものはありません。 +allocはNSObjectによって具体的に実装されたメソッドであり、コンパイラはいつ/どのように呼び出されるかは分かりません。初期化を提供するために、ランタイム(正確にはclass_createInstance())は作成時にインスタンス全体をゼロにし、実際には+allocに実装されています。

+0

ので、私たちは一種の0であること、それらの値を当てますが、おそらくより良い、具体的にすることができると思います'init'メソッドでそれを初期化してください –

+0

私たちはivarsが0であると考えています。Appleは明示的に' -init'でそれらを0にするのをやめます。 –

+0

本当に、性能上の理由からAppleはそれを嫌うのですか?私は状態を0から始めることを明示しているので、コードをもう少し明確にしています。 –

0

initメソッドを実装するだけで、指定されたイニシャライザを使用する必要があります。言語だけの理由は、クラス初期化のための特別な構文を提供しません。

+1

がかつて言った...なぜバドドライを飲んで、なぜ尋ねる... –

1

The Objective-C Programming Languageを参照してください:

のallocメソッドを動的に新しいオブジェクトのインスタンス変数にメモリを割り当て、0-すべてにそれらすべてを初期化し、それはそのクラスに新しいインスタンスを接続するISA変数を除いて、あります。オブジェクトが有用であるためには、一般に、より完全に初期化する必要があります。これがinitメソッドの機能です。

0

一般的なケース(厳密にはobjc)が回答されました。

代わりのソリューションとして、インスタンス変数にC++型を使用してこれを正確に実行できます。 C++のインスタンス変数では、C++型はデフォルトのコンストラクタを使用して初期化されます。例えば

:同僚として

namespace MON { 
    class t_animal { 
    public: 
     t_animal() : 
      state(AnimalStateAlive), 
      x(0), 
      y(0), 
      energyLevel(100) { 
     } 
     /* ... */ 
    private: 
     int state; 
     int x; 
     int y; 
     int energyLevel; 
    }; 
} /* << MON */ 

@interface Animal : NSObject 
{ 
@private 
    MON::t_animal animal; 
} 

@end 
関連する問題