2015-10-15 44 views
1

在我的头文件中,我声明了一些变量@property (nonatomic) NSInteger *soldWindows;并用它们跟踪计数,并用_soldWindows++;递增。结果始终出现了8倍。我发现我的问题是将它声明为指针,所以我将其更改为@property (nonatomic) NSInteger soldWindows;,这解决了我的问题。为什么指向NSInteger的指针将值乘以8?

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

+1

除了ChrisCM的正确答案之外,似乎并没有什么特别的原因让你使用NSInteger。所以简单地使用一个int intead。 – fishinear

+1

@fishinear根据目标,'NSInteger'是int或long的类型定义。那么切换到“int”的好处是什么? –

+3

@fishinear不好的建议。 – rmaddy

回答

5

指针指向内存中的某个位置。当你像这样增加一个指针时,你会增加指针的值,指向内存中的新位置。鉴于此,可以使用指针算术通过取消引用增加的指针来遍历数组中的连续元素。所以,你不是递增1,而是按你指针类型的大小递增。一个NSInteger只不过是一个64或32位int,具体取决于平台。在这种情况下,它似乎是64位,即8个字节。这是你的8位“缩放”来自哪里。

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

+0

你的解释是正确的。这个例子相当混乱(如果意味着实际的代码错误)。 –

+1

“当你增加它指向的内存中的位置时”听起来像指针增加了,而不是指针。那将是错误的。指针中的地址递增,而不是内存中的地址。 –

0

我声明了一些变量,如NSInteger * soldWindows;并用它们来跟踪计数。

您正在滥用指针的概念。在C中,指针是内存中对象的地址。在你的用例中没有指向的对象 - 只是指向无处的地址。

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

为什么整数值按8缩放?

其原因被称为指针运算。每个C指针都有一个类型。该类型描述指针保存地址的内存中的对象。当您增加一个指针时,编译器实际上会将该对象的大小添加到指针中,以便它指向上一个之后的对象。

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

+1

@ChrisCM我假设OP使用指针作为它的值(可能初始化为'NULL'左右)。他看到8步的增量值,因此他将指针值用作积分标量值。我不认为他实际上指向了什么(除了虚拟内存中的随机地址外,这就是我的意思是“没有”)。解引用指针将是未定义的行为。 –

相关问题