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
ますか?
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
ますか?
Objective-C にはコンストラクタのようなものがないからです。+alloc
特に NSObject によって実装されたメソッドであり、コンパイラはそれがいつ/どのように呼び出されるかわかりません。初期化を提供するために、ランタイム (class_createInstance()
正確には ) は作成時にインスタンス全体をゼロにします。実際、これは で実装されてい+alloc
ます。
参照The Objective-C Programming Language
:
alloc メソッドは、新しいオブジェクトのインスタンス変数にメモリを動的に割り当て、それらをすべて 0 に初期化します。つまり、新しいインスタンスをそのクラスに接続する isa 変数を除くすべてです。オブジェクトが有用であるためには、通常、より完全に初期化する必要があります。それが init メソッドの機能です。
init メソッドを実装するだけで、指定されたイニシャライザを使用する必要があります。その理由は、言語がクラスの初期化のための特別な構文を提供していないからです。
一般的なケース (厳密には 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