这似乎是一个微不足道的问题。
但是为什么我们在声明对象变量时必须使用星号符号
就像我们做的那样
Car * mazda = [[Car alloc] init];
星号的重要性是什么,我的意思是编译器已经知道它是一个对象,我确信编译器可以训练不要抱怨它。但是再次通过省略它,我收到一条错误消息“静态分配objective-c类NSObject的实例”这样做的目的是什么?
答案 0 :(得分:11)
asterix是您声明的Car变量的限定符。这意味着你要声明一个指向Car的指针,而不是声明一个Car本身。 init函数的返回值(以及该函数的alloc函数)是指向Car的指针,而不是Car本身,因此这是正确的。
答案 1 :(得分:6)
使用*
声明指针。这就像在C中,它是ObjC的一个子集。如果没有*
,则静态分配变量,这对于ObjC对象是不可能的(因为在编译时无法确定对象的大小)。
静态分配的变量用于原始C类型,如int或double
int number = 42;
答案 2 :(得分:4)
Objective-C要求动态分配所有对象(即在堆上)。您获得的错误表明您正在尝试在堆栈上创建Car对象。通过声明马自达是指向Car(Car *)而不是Car的指针,您可以满足该要求。
答案 3 :(得分:1)
这实际上是Why [object doSomething] and not [*object doSomething]?的欺骗,它有大量的背景信息。
答案 4 :(得分:0)
变量声明中的asterix也意味着变量的值不具有静态分配值。它的指针就像其他人说的一样。