Objective c 为什么用星号声明对象变量

Objective c 为什么用星号声明对象变量,objective-c,cocoa,Objective C,Cocoa,这似乎是个微不足道的问题 但是为什么在声明对象变量时必须使用星号符号呢 就像我们一样 Car * mazda = [[Car alloc] init]; 星号的重要性是什么,我的意思是编译器已经知道它是一个对象,我相信编译器可以接受培训,不抱怨它。但是,通过省略它,我得到了一条错误消息“静态分配objective-c类NSObject的实例”,这有什么作用?asterix是您声明的Car变量的限定符。这意味着您正在声明指向汽车的指针,而不是声明汽车本身。init函数(以及alloc函数)的返回

这似乎是个微不足道的问题

但是为什么在声明对象变量时必须使用星号符号呢

就像我们一样

Car * mazda = [[Car alloc] init];

星号的重要性是什么,我的意思是编译器已经知道它是一个对象,我相信编译器可以接受培训,不抱怨它。但是,通过省略它,我得到了一条错误消息“静态分配objective-c类NSObject的实例”,这有什么作用?

asterix是您声明的Car变量的限定符。这意味着您正在声明指向汽车的指针,而不是声明汽车本身。init函数(以及alloc函数)的返回值是指向Car的指针,而不是Car本身,因此这是正确的。

Objective-C要求动态分配所有对象(即在堆上)。您得到的错误表明您正在尝试在堆栈上创建汽车对象。通过将马自达声明为指向汽车的指针(Car*),而不是汽车,您就满足了这一要求。

使用
*
可以声明一个指针。这就像在C中一样,它是ObjC的一个子集。如果没有
*
,变量将被静态分配,这对于ObjC对象是不可能的(因为在编译时无法确定对象的大小)

静态分配的变量用于基本C类型,如int或double

int number = 42;

这实际上是一个副本,它有大量的背景信息。

变量声明中的asterix也意味着变量的值将不具有静态分配值。正如其他人所说,这是一个指针。

谢谢,这很有道理。因此,asterix在任何情况下都是强制性的,对吗。或者我想问的是,在哪些情况下我们不使用asterix。当你谈论一辆真正的
汽车
(或者你正在处理的任何类别),你不需要
*
。当您引用指向
汽车的指针时(就像在本例中),您是这样做的。在Objective-C中没有不使用星号的情况。从这个意义上说,它是不需要的。但是,C中的所有其他指针类型以及Objective-C都使用星号–例如int*foo–因此它是为了保持一致性。@Daniel DiPaolo:您的评论令人困惑。你什么意思
[Car class]
当然也是一个指针。@nils:Daniel的意思是,如果您处理的是实际对象,即不是指向该对象的指针或堆栈上分配的对象,则不会使用
*
。当然,在Objective-C中,您不能在堆栈上分配对象,因此这一点是没有意义的。谢谢,在什么情况下我不使用asterix?如果所讨论的变量是Objective-C对象,您将始终使用星号。如果变量是C-struct或primitive(NSInteger、CGRect、CGFloat、int等),则不需要使用星形,因为C可以在堆栈上创建对象。可能的重复