在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
发生后立即填写这些值吗?
答案 0 :(得分:3)
因为在Objective-C中没有构造函数这样的东西。 +alloc
是由NSObject专门实现的方法,编译器不知道何时/如何调用它。为了提供初始化,运行时(class_createInstance()
,确切地说)在创建时将整个实例清零,事实上,这是在+alloc
中实现的。
答案 1 :(得分:1)
请参阅The Objective-C Programming Language
:
alloc方法为新对象的实例变量动态分配内存,并将它们全部初始化为0-all,即除了将新实例连接到其类的isa变量之外。要使对象有用,通常需要对其进行更全面的初始化。这是init方法的功能。
答案 2 :(得分:0)
您应该使用指定的初始化程序,只需实现init方法。原因只是语言没有为类初始化提供特殊的语法。
答案 3 :(得分:0)
常见案例(严格意义上的对象)已得到解答。
作为替代解决方案,您可以使用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