1

我有一个NSUInteger. 在viedDidLoad我将其设置为 0 的方法中:

@property NSUInteger *unitOne;

//In viewdidload
_unitOne = 0;

这增加了一个。(这是在touchesBegan方法中。此代码仅在UIImageView单击 a 时发生。UIImageView在循环中向下动画。)

_unitOne++;
NSLog(@"%lu", (unsigned long) _unitOne);

unitOne应该等于 1 时,调试器总是说它是 8。当它需要等于 2 时,它是 16,依此类推。有任何想法吗?

注意:如果有人需要更多代码,请告诉我您认为哪里出错了,我会添加它。

4

1 回答 1

3

您有一个指向 an 的指针NSUInteger,而不是 anNSUInteger本身。NSUInteger是“原始”、“标量”类型,而不是对象类型。您不需要使用指向它们的指针。

因此,您创建了一个指针并将其设置为空指针值。0始终可以分配给指针变量并使其成为空指针。因此,您认为您正在将整数值分配给整数变量,但事实并非如此。

然后,您增加了指针。C 的语义是递增指针将其推进到所指向类型的“下一个”元素。因此,指针不是增加 1 个字节,而是增加NSUInteger. 编译 64 位代码时,NSUInteger大小为 8 个字节。因此,指针增加了 1 NSUInteger,即 8 个字节。

然后,当您记录实例变量时,您使用类型转换将其转换为unsigned long. 这愚弄了编译器,否则编译器会警告使用%lu指针参数。记录了指针变量的值,但它只指向从空指针 (0) 向上的 8 个字节,依此类推。

于 2014-11-20T00:09:29.817 回答