Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Objective-C中,为什么可以';t对象';s实例变量或属性是否具有默认值?_Objective C - Fatal编程技术网

在Objective-C中,为什么可以';t对象';s实例变量或属性是否具有默认值?

在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方法

在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方法。原因是该语言没有为类初始化提供特殊语法。

为此,您应该使用指定的初始值设定项,只需实现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运行时的行为是如此的普遍。