2

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ますか?

4

4 に答える 4

3

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

于 2012-04-23T04:51:16.827 に答える
1

参照The Objective-C Programming Language

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

于 2012-04-23T04:52:38.963 に答える
0

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

于 2012-04-23T04:50:31.680 に答える
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
于 2012-04-23T05:00:46.113 に答える