在 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