Objective c 在目标C中声明变量时,何时不应使用星号(*)

Objective c 在目标C中声明变量时,何时不应使用星号(*),objective-c,iphone,Objective C,Iphone,我刚刚开始学习目标c,星号给我带来了一些麻烦。当我浏览示例代码时,有时在声明变量时使用,有时不使用。什么时候应该使用它的“规则”是什么。我认为这和变量的数据类型有关。(对象数据类型需要星号,像int这样的简单数据类型不需要星号)但是,我也看到过像CGPoint这样的对象数据类型没有星号?是否有一个明确的答案,或者它是否与您如何以及如何使用变量有关?星号表示变量是指向数据类型的指针 你应该调查更多的信息。它们是编程的一个非常重要和基本的方面。我认为您应该先阅读一些关于C编程的知识。Objectiv

我刚刚开始学习目标c,星号给我带来了一些麻烦。当我浏览示例代码时,有时在声明变量时使用,有时不使用。什么时候应该使用它的“规则”是什么。我认为这和变量的数据类型有关。(对象数据类型需要星号,像int这样的简单数据类型不需要星号)但是,我也看到过像CGPoint这样的对象数据类型没有星号?是否有一个明确的答案,或者它是否与您如何以及如何使用变量有关?

星号表示变量是指向数据类型的指针


你应该调查更多的信息。它们是编程的一个非常重要和基本的方面。

我认为您应该先阅读一些关于C编程的知识。Objective-C是C的超集。
不使用*声明CGPoint的原因是因为CGPoint是一个结构,请查看CGGeometry.h头文件。

听起来您已经找到了规则:星号表示指针,否则不使用星号。问题是,没有规则可以确定像CGPoint这样的东西是否需要指针而不查看头文件。正如Welbog所说,何时使用/不使用指针的真正区别在于您是在堆上还是在堆栈上进行分配,尽管大多数时候您只需要确定您是在使用对象(星号)还是原语(无星号)

什么时候应该使用它的“规则”是什么

您可以使用星号来声明指针

对于Cocoa对象,您总是声明一个指针,因此总是使用星号。不能将对象本身放入变量中;始终处理指向对象的指针

对于其他方面,这取决于变量是包含对象(在C意义上)还是指向其他地方对象的指针。如果变量应该包含对象,那么就不要用星号声明它,因为您没有在其中放置指针。如果它应该包含一个指针,那么您可以用星号声明它

你甚至可以有一个指向指针的指针;正如您所料,这涉及多个星号。例如,
NSRect**
是指向NSRect的指针(它是一个结构,而不是对象)

我认为这和变量的数据类型有关。(对象数据类型需要星号,像int这样的简单数据类型不需要星号)

有点。Cocoa对象需要星号,因为您只能处理指向Cocoa对象的指针,而不能处理对象本身。但对于可可对象来说,声明的规则没有什么不同;他们完全一样。需要指针变量时使用星号;如果需要非指针变量,则不需要

唯一的例外,Cocoa对象与常规规则的唯一区别是,不允许声明包含对象本身的变量。这就是为什么你从来没有看到一个变量持有一个Cocoa对象而不是指向一个Cocoa对象的指针:编译器不会允许它

但是,我也看到过对象数据类型,比如声明的CGPoint没有星号


CGPoint是一个结构,而不是Cocoa对象。因此,您可以声明一个包含CGPoint的变量,而不是指向其他地方的指针。

当变量类型为类时,您可以使用
*

举个例子可能会有所帮助

NSNumber *number;
NSInteger integer;
NSNumber
变量类型是一个类,而
NSInteger
只是普通C型
int
的另一个名称。正如您在这里看到的,编译器将每次出现的
NSInteger
替换为
int

#if __LP64__ || NS_BUILD_32_LIKE_64
  typedef long NSInteger;
  typedef unsigned long NSUInteger;
#else
  typedef int NSInteger;
  typedef unsigned int NSUInteger;
#endif

此外,如果不使用指针,则不能声明类(对象)的实例,如
NSNumber
(因此使用
*
)。这是因为当您
alloc
将类的实例作为对象时,会返回内存地址。指针是一种特定于内存位置的变量类型。例如:

NSNumber *number = [NSNumber alloc];
这里的
number
的数值将是一个类似
0x19a30c0
的内存位置。你可以通过加减法来操作它,比如
int
。将其声明为
NSNumber
指针的关键目的是,编译器可以帮助程序员验证类是否具有某些方法或访问已知属性


最后一个例子:

NSInteger integer = [NSNumber alloc];
integer
的值是多少?在我们的示例中,它将是0x19a30c0。这样,您实际上仍然可以通过
[integer somethod]
访问新分配的
NSNumber
对象。不过,编译器会给您一个警告。更多详情:

integer += 4;
这将影响数值
0x19a30c0
,方法是向其添加4并使其成为
0x19a30c4



有关如何、何时以及为什么使用
*
运算符的更多示例,请参阅上的这篇维基百科文章。

答案非常简单:在使用Objective-C对象时,应始终使用星号

原因是它们不能在堆栈上分配,因此您无法对CGPoint这样的结构执行您可以执行的操作


我想,Objective-C的设计者选择让你总是加上那个星号,因为它们是指向内存的指针,就像其他C指针一样。

我理解这意味着它是一个指针。但是我的问题是什么时候应该或者不应该使用指针?这完全取决于情况。例如,如果希望从函数返回值,则需要使用堆分配的内存,否则函数退出时会回收该值。引用数组也需要指针。这不是一个容易回答的问题,杰森。堆栈分配很有用,因为您不必担心太多内存问题,但是