为什么指向 NSInteger 的指针会将值乘以 8?

Why does a pointer to an NSInteger multiply the value by 8?

在我的 header 中,我将一些变量声明为 @property (nonatomic) NSInteger *soldWindows; 并使用它们来跟踪计数,以 _soldWindows++; 递增。结果始终是应有的 8 倍。我发现我的问题是将它声明为指针,所以我将其更改为 @property (nonatomic) NSInteger soldWindows; 这解决了我的问题。

我的问题是,如果它只是存储一个内存地址,为什么整数值被缩放 8 而不是任意地址?

一个指针指向内存中的一个地方。当你像这样增加一个指针时,你增加了指针的值,指向内存中的一个新位置。鉴于此,您可以使用指针算法通过取消引用递增的指针来迭代数组中的连续元素。因此,您不是按 1 递增,而是按指针类型的大小递增。 NSInteger 只不过是 64 位或 32 位 int,具体取决于平台。在这种情况下,它似乎是 64 位,即 8 个字节。这就是您的 8 位 "scaling" 的来源。

结论:您的修复是正确的!

I declared a few variables as [...] NSInteger *soldWindows; and used them to keep track of counts.

您误用了指针的概念。在 C 中,指针是对象在内存中的地址。在您的用例中,没有对象被指向——只是指向无处可去的地址。

虽然这不是问题,但只要您不取消引用指针,它仍然令人困惑(并且没有任何帮助)。一个简单的整数(如 intNSInteger)是更好的选择。

why was the integer value scaled by 8?

这样做的原因叫做指针运算。每个 C 指针都有一个类型。类型描述了指针所在内存中的对象的地址。当你递增一个指针时,编译器实际上将对象的大小加到指针上,这样它就指向前一个对象之后的对象。

NSInteger(64 位 iOS)的大小是 64 位 = 8 字节。这就是为什么增加 NSInteger * 实际上会增加 8。