在Objective-C中,为什么对象的实例变量或属性不能具有默认值?

时间:2012-04-23 04:48:18

标签: 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发生后立即填写这些值吗?

4 个答案:

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