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 回答