objective-c - 在 Objective C 中声明变量时什么时候不应该使用星号 (*)

标签 objective-c iphone

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

最佳答案

What are the "rules" for when it should be used.

您使用星号来声明一个指针。

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

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

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

I thought it had something to do with the data type of the variable. (asterisk needed for object data types, not needed for simple data types like int)

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

唯一的异常(exception),也是 Cocoa 对象与通常规则的唯一区别,就是您不能声明一个保存对象本身的变量。这就是为什么您永远不会看到一个变量持有 Cocoa 对象而不是一个指向 Cocoa 对象的指针:编译器不允许这样做。

However, I have seen object data types such as CGPoint declared without the asterisk as well?

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

关于objective-c - 在 Objective C 中声明变量时什么时候不应该使用星号 (*),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1172600/

相关文章:

ios - swift ,线程 1 : EXC_BAD_INSTRUCTION error

ios - Obj-c - 同时返回两个自定义单元格

ios - 显示键盘时如何决定滚动哪个 UIScrollView

iphone - 如何在设备重启时在后台运行 ios 应用程序?

iphone - 从 TableView 中删除多个单元格

iphone - 如何检查我是否从 json 中得到 null?

objective-c - 自定义 NSURLProtocol 应该遵循重定向本身,还是让其客户担心?

iphone - 使用 CAAnimation 制作图像动画

ios - Jenkins 生成的 ipa 无法在 iPhone 上安装(iOS 9 + XCode 7.1)

iphone - 如何将我的 3ds Max 模型放入 iPhone 3D 游戏中?