在Objective-C中,为什么可以';t对象';s实例变量或属性是否具有默认值?
在Objective-C中,为什么我们不能使用在Objective-C中,为什么可以';t对象';s实例变量或属性是否具有默认值?,objective-c,Objective C,在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发生后立即填充这些值?您应该使用指定的初始值设定项,只需实现init方法
@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
发生后立即填充这些值?您应该使用指定的初始值设定项,只需实现init方法。原因是该语言没有为类初始化提供特殊语法。为此,您应该使用指定的初始值设定项,只需实现init方法。原因是该语言没有为类初始化提供特殊语法。因为objective-C中没有构造函数。+alloc
是由NSObject具体实现的方法,编译器不知道何时/如何调用它。为了提供初始化,运行时(class_createInstance()
,准确地说)在创建时将整个实例归零,事实上,这是在+alloc
中实现的,因为objective-C中没有构造函数。+alloc
是由NSObject具体实现的方法,编译器不知道何时/如何调用它。为了提供初始化,运行时(class_createInstance()
,准确地说)在创建时将整个实例归零,事实上,这是在+alloc
中实现的。请参阅:
alloc方法动态地为新对象的实例变量分配内存,并将它们全部初始化为0-all,也就是说,除了将新实例连接到其类的isa变量之外。要使对象有用,通常需要对其进行更完全的初始化。这是init方法的函数
参考:
alloc方法动态地为新对象的实例变量分配内存,并将它们全部初始化为0-all,也就是说,除了将新实例连接到其类的isa变量之外。要使对象有用,通常需要对其进行更完全的初始化。这是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
名称空间MON{
t_类动物{
公众:
t_animal():
状态(动物状态活着),
x(0),
y(0),
能量级(100){
}
/* ... */
私人:
int状态;
int x;
int-y;
国际能源水平;
};
}/*普通案例(严格来说是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
名称空间MON{
t_类动物{
公众:
t_animal():
状态(动物状态活着),
x(0),
y(0),
能量级(100){
}
/* ... */
私人:
int状态;
int x;
int-y;
国际能源水平;
};
}/*因此,我认为我们可以将这些值计算为0,但在init
方法中,我们应该将ivar计算为0。苹果明确反对在-init
中将它们初始化为0。真的吗,苹果反对它是因为性能原因吗?它确实使代码更加清晰,因为它清楚地表明我希望状态从0开始。它实际上并没有使代码更加清晰。这是一个规范,因此Obj-C运行时的行为是如此,这是一个共同的事实。因此我认为我们可以将这些值计算为0,但最好是在init
方法中具体初始化,我们应该将IVAR计算为0。苹果明确反对在-init
中将它们初始化为0。真的吗,苹果反对它是因为性能原因吗?它确实使代码更加清晰,因为它清楚地表明我希望状态从0开始。它实际上并没有使代码更加清晰。这是一个规范,因此Obj-C运行时的行为是如此的普遍。